将记录附加到Laravel的hasManyThrough关系

5

一个简单而直接的问题:

当使用Laravel的hasManyThrough关系时,我该如何附加或分离新记录?从文档here中可以明显看到模型的检索。

编辑:换句话说,是否有一种更聪明的Laravelish方式来执行以下操作(模型名称取自文档)?

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

提前感谢。


1
你没有其他方法来更新HasManyThrough的关系,因为它是模型中的一个属性...只需检索要更新的帖子和要分配给它的用户即可。 - Chin Leung
2个回答

4

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 填充外键并持久化模型

如果我们有一个GrandParent模型,并且我们尝试通过HasManyThrough关系保存一个子模型:

$grandparent->grandchildren()

"Laravel不仅需要填充父外键,还可能需要创建一个新的父模型,因为我们不确定它是否存在。这就是为什么没有实现“save”方法的原因。因此,您可以创建类似于以下内容的代码:"
$grandparent->grandchildren()->firstOrNew(['parent_id' => $parent_id])->save();
// Or
$grandparent->grandchildren()->updateOrCreate(['parent_id' => $parent_id]);

你需要一个有效的密钥,否则会出现SQL约束违规。

在laravel 5.8中,'Push'在我的情况下无法正常工作,这促使我寻找原因并得到了这个答案。 - sr9yar

4

hasManyThrough() 需要一个已经存在的中介关系。在文档示例中,User 是中介关系。直接将 Post 附加到 Country 上是不可能的,因为它不知道哪个 User 拥有它。你需要先将它附加到 User 上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接