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(...));
Laravel заполняет внешний ключ и сохраняет модель
Если у нас также была модель 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.