Присоединение записей к отношению Laravel hasManyThrough

Простой и прямой:

Как я могу использовать присоединять или отсоединять новые записи при использовании отношения Laravel hasManyThroughпуть Ларавеля? Извлечение модели очевидно из документации здесь.

РЕДАКТИРОВАТЬ: Другими словами, есть ли Ларавельский способ более разумного выполнения следующих действий (названия моделей взяты из документации)?

$user = $country->users()->first;
$post->user_id = $user->id;
$post->save();

Заранее спасибо.

На самом деле у вас нет других способов обновить отношение для HasManyThrough, поскольку это атрибут в модели... Просто извлеките сообщение, которое вы хотите обновить, и пользователя, которому его нужно назначить.

Chin Leung 12.06.2019 20:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
1
4 401
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

https://laravel.com/api/5.8/Illuminate/Database/Eloquent/Relations/HasManyThrough.html

Да, но вы должны указать все параметры.

firstOrNew 
// (Doesn't persist to DB, you have to manually call the save method later on the created model)
updateOrCreate 
// (Persists to DB)
rawUpdate 
// (Persists to DB, not recommended)

Согласно документации, push тоже должен работать.

В отношениях 1:M есть метод save, доступный из коробки. Это потому, что единственное поле, которое Laravel имеет для Заполнить, — это внешний ключ.

Например, допустим, у вас есть модели Parent и Child. Когда вы звоните

$parent->children()->save(new Child(...));

Ларавель заполняет внешний ключ и сохраняет модель

Если бы у нас также была модель GrandParent, и мы попытались бы сохранить дочерний элемент через отношение HasManyThrough:

$grandparent->grandchildren()

Laravel пришлось бы не только заполнить внешний ключ Parent, но, возможно, даже создать новую модель Parent, поскольку мы не уверены, что она существует. Вот почему метод save не реализован.

Таким образом, вы можете сделать что-то вроде

$grandparent->grandchildren()->firstOrNew(['parent_id' => $parent_id])->save();
// Or
$grandparent->grandchildren()->updateOrCreate(['parent_id' => $parent_id]);

Вам также нужен действительный ключ, иначе вы получите нарушение ограничения SQL.

«Push» не работал у меня в этом случае в laravel 5.8, что привело меня к поиску причины и этому ответу.

sr9yar 13.12.2020 18:17
Ответ принят как подходящий

hasManyThrough() требует существующих промежуточных отношений. В примере с документами User — это промежуточное отношение. Непосредственное присоединение Post к Country невозможно, потому что неизвестно, кому из User оно принадлежит. Вам нужно сначала прикрепить его к User.

Другие вопросы по теме