繁体   English   中英

将记录附加到 Laravel hasManyThrough 关系

[英]Attaching records to a Laravel hasManyThrough relation

一个简单直接的:

以 Laravel 方式使用 Laravel hasManyThrough关系时,如何附加或分离新记录 模型检索很明显,来自这里的文档。

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

$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 唯一需要填写的字段是外键。

例如,假设您有一个ParentChild模型。 你打电话时

$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 约束。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM