Простой и прямой:
Как я могу использовать присоединять или отсоединять новые записи при использовании отношения Laravel hasManyThroughпуть Ларавеля? Извлечение модели очевидно из документации здесь.
РЕДАКТИРОВАТЬ: Другими словами, есть ли Ларавельский способ более разумного выполнения следующих действий (названия моделей взяты из документации)?
$user = $country->users()->first;
$post->user_id = $user->id;
$post->save();
Заранее спасибо.






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, что привело меня к поиску причины и этому ответу.
hasManyThrough() требует существующих промежуточных отношений. В примере с документами User — это промежуточное отношение. Непосредственное присоединение Post к Country невозможно, потому что неизвестно, кому из User оно принадлежит. Вам нужно сначала прикрепить его к User.
На самом деле у вас нет других способов обновить отношение для HasManyThrough, поскольку это атрибут в модели... Просто извлеките сообщение, которое вы хотите обновить, и пользователя, которому его нужно назначить.