Laravel 多对多合并 Pivot?

Posted

技术标签:

【中文标题】Laravel 多对多合并 Pivot?【英文标题】:Laravel Many To Many Merges Pivot? 【发布时间】:2021-11-29 03:14:22 【问题描述】:

我一定是疯了,或者真的很累。所以我遇到了这种情况,我得到了分配给用户的所有角色的集合。那部分没问题....但是我注意到一些非常奇怪的东西。

我正在使用 Laravel 8 和 php8(不是奇怪的部分)。

出于某种原因,我不仅从另一个表中得到结果,而且还合并了数据透视表。我不知道为什么会这样。示例如下:

与用户模型的关系:

   /**
     * Relationship with roles model.
     *
     * @return BelongsToMany
     */
    public function roles(): BelongsToMany
    
        return $this->belongsToMany(
            Role::class,
            'role_user',
            'user_id',
            'role_id'
        )->withTimestamps();
    

角色模型的关系:

/**
 * Relationship with users table.
 *
 * @return BelongsToMany
 */
public function users(): BelongsToMany

    return $this->belongsToMany(
        User::class,
        'role_user',
        'role_id',
        'user_id'
    )->withTimestamps();

在用户模型中,我有这个。

$this->roles->each(function($role) 
    dd($role);
);

我期待得到相关模型的转储,但由于某些奇怪的原因,我得到的是与模型合并的数据透视表:

"id" => 7 // this is the relation ID from the pivot table
"display_name" => "Administrator" // this is from Role model
"code" => "admin" // role model
"description" => "Super User - can do everything in the system. This role should only be assigned to IT staff member." // role model
"created_at" => "2021-10-01 11:00:00" // pivot table
"updated_at" => null // pivot table
"deleted_at" => null // pivot table
"role_id" => 1 // pivot table
"user_id" => 2 // pivot table

要么我做错了什么,要么我遗漏了一些非常明显的东西。有谁知道这里到底发生了什么?

只是补充一点:数据来自两个地方,但结果只是预期的角色模型。

我不应该只获得没有核心内容的角色模型吗?它覆盖了我的榜样领域。

编辑:

括号似乎有所作为。数据仍然合并。但是,当我这样做时,看起来来自最终模型的数据被合并(因此它覆盖)到来自枢轴的数据。所以我得到了正确的 ID。

$this->roles()->each(function($role) 
       echo $role;
   );

但这给了我这个奇怪的带有错误 ID 的枢轴合并版本。

$this->roles->each(function($role) 
       echo $role;
   );

【问题讨论】:

您是否在用户或角色模型中反对 $with 属性? @OMR 我没有。不过,我在帖子中添加了额外的内容。我不确定两者之间有什么区别,但这与关系的运作方式有关。 可能是我试图使用模型内部的关系吗? 【参考方案1】:

我知道那是什么。我不假思索地将 ID 列添加到了数据透视表中。

pivot 中的这个 ID 覆盖了我的最终模型中的 ID。删除后问题就消失了。

我不知道为什么 Laravel 默认会添加这些字段并与数据透视列合并...我想它只是无缘无故地这样做。虽然我不明白如果有一个单独的机制来访问数据透视表(模型上的数据透视关系)有什么意义。

这让我觉得我做错了什么。但是,是的,希望它有所帮助。如果有人知道为什么 Laravel 会自动添加数据透视表,请告诉我。

【讨论】:

以上是关于Laravel 多对多合并 Pivot?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 多对多查询

Laravel Eloquent 根据数据透视表字段条件获取多对多关系

多对多表 id 的最佳实践

laravel怎么取出多对多关联表的一个字段,组成一个数组

是否可以使用 findAll() 创建查询并通过使用来自 pivot 的 ForeignKey(关系多对多)获得过滤结果?

多对多关系 - 如何更新数据透视表中的属性