将记录附加到Laravel hasManyThrough关系

时间:2019-06-12 17:30:16

标签: php laravel eloquent

一个简单而直接的方法:

当使用Laravel hasManyThrough 关系 Laravel方法时,如何附加或分离新记录? 从文档here中可以很明显地看到模型。

编辑:换句话说,是否存在繁琐的方式来使以下操作更聪明(模型名称取自文档)?

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

谢谢。

2 个答案:

答案 0 :(得分:0)

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必须填写的唯一字段是外键。

例如,假设您有一个ParentChild模型。致电

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

Laravel fills in the foreign key and persists the model

如果我们也有一个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约束。

答案 1 :(得分:0)

hasManyThrough()需要一个现有的中间关系。在docs示例中,User是中间关系。无法将Post直接附加到Country,因为它不知道哪个User拥有它。您需要先将其附加到User