【问题标题】:Attaching records to a Laravel hasManyThrough relation将记录附加到 Laravel hasManyThrough 关系
【发布时间】:2019-06-13 03:17:08
【问题描述】:

简单直接的:

当使用 Laravel hasManyThrough 关系Laravel 方式时,我如何附加或分离新记录? 模型检索很明显,来自文档here

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

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

提前致谢。

【问题讨论】:

  • 您实际上没有其他方法来更新 HasManyThrough 的关系,因为它是模型中的一个属性...只需检索您要更新的帖子以及将其分配给的用户。

标签: php laravel eloquent


【解决方案1】:

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

【讨论】:

  • 'Push' 在 laravel 5.8 的这种情况下对我不起作用,这导致我寻找原因和这个答案。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2018-10-18
    • 2023-03-09
    • 2017-11-18
    • 2018-07-24
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    • 2018-03-08
    • 2021-12-06
    相关资源
    最近更新 更多