【问题标题】:Laravel: save / attach / sync custom pivot model (belongsToMany)Laravel:保存/附加/同步自定义枢轴模型(belongsToMany)
【发布时间】:2021-01-08 04:46:27
【问题描述】:

希望你今天过得愉快。

我正在使用 Laravel 8。我有三个模型,我需要这些模型“纠缠”,可以这么说。

所以,我有三个基本表

areas,threats,positions
---
id
name

所以需要的关系是这样的:

  • 每个t3 属于ToMany t1,反之亦然。 (多对多)
  • 每个t3.t1 关系都属于ToMany t2(多对多)

到目前为止,我的方法是这样的:

  • 对于第一个关系,我在模型上定义了 belongsToMany 关系 (t3.t1)。
  • 对于第二个关系,我为数据透视表创建了一个 custom pivot model,在该模型中我定义了第二个多对多关系 (t3t1.t2)。

到目前为止,第一个关系可以通过$model->relatedModel()->attach($id);保存。

现在,对于第二个关系,我如何附加相关模型?

我最后的手段是查询已保存的自定义数据透视模型并附加 t2 模型,但我想先询问是否有更简洁的 eloquent-laravel 方法来执行此操作.

任何建议都会有所帮助。提前感谢您抽出宝贵时间。

【问题讨论】:

  • 可以分享一下你用过的代码吗?

标签: laravel eloquent eloquent-relationship


【解决方案1】:

解释

attach 方法实际上是一个Model 函数。所以你的withPivot t3.t1 还不是模特 ,当您使用pivot magic method 访问时,您的关系属于许多它只返回列

答案

所以对于你的情况,withPivott3.t1 转为Model instance。这里是步骤

  1. 创建扩展 use Illuminate\Database\Eloquent\Relations\Pivot; 的新 PivotModel
  2. 在您的t1Model 上,将using($classNamespace) 添加到belongsToMany 方法中,例如:belongsToMany()->using(PivotModel::class)
  3. 然后当t1->getT2s->pivot 已经返回Model instance 并且您可以使用attach 函数到该枢轴

【讨论】:

    【解决方案2】:

    我能想到的两种方式之一就是参考Spatie Laravel Role permission

    在 Spatie 中,这种关系类似于 PermissionRole 之间的多对多关系以及映射用户、角色和权限的多对多多态关系。

    在多对多枢轴关系中使用额外属性。

    somethinglike

    return $this->belongsToMany('App\Role')->withPivot('column1', 'column2');
    

    附加和分离也接受extra attributes

    $user->roles()->attach($roleId, ['expires' => $expires]);
    

    在检索时,您可以使用 where 子句来指定您的选择

    return $this->belongsToMany('App\Role')->wherePivot('approved', 1);
    

    我希望这会给你足够的想法来实现它。所有sn-p都来自文档,大家可以直接搜索参考

    【讨论】:

    • 我实际上是用你回答的数据透视列实现的。我想知道是否有更“雄辩”的方式来做到这一点,也许 spatie 方法更有可能奏效。谢谢。
    • @Chuy 为什么你认为,这不是雄辩的?我想了解这一点,以便我可以考虑您希望如何实现它?
    • @Chuy 我的另一个问题是,您对实施 spate 方式有何想法?
    • 当我说“雄辩”时,我的意思是使用声明性方式来提取信息(因为 spatie 权限处理它)。亲切的问候。
    • @Chuy 好的,那么您认为如果您实施 spate 方式,您的问题会得到解决吗?如果是的话,你需要我解释一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 2016-08-13
    • 2019-05-31
    • 2018-08-28
    • 1970-01-01
    • 2017-04-27
    相关资源
    最近更新 更多