【问题标题】:Laravel Relationship - Additional fields in pivot table linking to additional modelsLaravel 关系 - 数据透视表中的其他字段链接到其他模型
【发布时间】:2019-11-14 17:45:15
【问题描述】:

我已经简化了问题以达到重点。我有三张桌子,usersrolesaccount

通常我会将 User 模型设置为与角色建立多对多关系,但我希望这些角色特定于每个帐户。所以我在数据透视表中添加了一个额外的字段。这是我拥有的表格和字段;

“用户”表

|—————————

| id | name |

|—————————

| 1 | Bob    |

| 2 | Jim     |

| 3 | Fred   |

|—————————

“角色”表

|—————————

| id | title |

|—————————

| 1 | Administrator    |

| 2 | Manager           |

| 3 | Approver           |

|—————————

“帐户”表

|—————————

| id | name |

|—————————

| 1 | ABC Company    |

| 2 | XYZ Shipping     |

| 3 | KLM Transport   |

|—————————

然后我有一个数据透视表role_user 和一个额外的账户数据透视字段;

|—————————

| role_id | user_id | account_id

|—————————

| 1         | 3           |  1

| 2         | 2           |  1

| 3         | 2           |  3

| 3         | 1           |  2

|—————————

在设置多对多关系时,我在 belongsToMany 函数上使用了 withPivot 函数。这使我可以使用$user->roles->pivot->account_id 获取信息,但我需要的是能够获取该公司的名称。它传递给刀片模板的只是来自数据透视表的 id,而不是将其链接到实际的 Account 模型。

Eloquent 有没有办法以与原始关系相同的方式获得整个模型?

【问题讨论】:

  • 你使用的 Laravel 版本是什么?另外,User/Role 和 Account 模型之间有什么关系?
  • Laravel 5.8... 用户可以有多个角色,每个角色都与一个特定的帐户相关联。所以用户/角色是多对多,但我想为每个用户/角色对指定哪个帐户。
  • 所以角色属于一个账户,一个账户可以有很多角色,对吧?
  • 不完全。用户可以在每个帐户中拥有一个角色。例如,User1 可能是 AccountA 的管理员,但可能只是 AccountB 中的作者,因此我需要在数据透视表中链接 Account ID。没关系,但我只能收到帐户 ID,而不是有关帐户模型的任何其他内容。

标签: php laravel-5 laravel-blade laravel-5.8


【解决方案1】:

创建自定义透视模型

use Illuminate\Database\Eloquent\Relations\Pivot;

class RoleUserAccountPivot extends Pivot
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function role()
    {
        return $this->belongsTo(Role::class);
    }

    public function account()
    {
        return $this->belongsTo(Account::class);
    }
}

更新您的 belongsToMany 关系

下面是User::roles 关系的示例

class User //extends...
{
    public function roles()
    {
        return $this->belongsToMany(Role::class, /*other parameters*/)->using(RoleUserAccountPivot::class)->withPivot('account_id');
    }
}

用法

$user->roles->first()->pivot->account // returns Account model

希望对你有帮助。


参考链接:

Laravel doc on custom pivots

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2020-02-12
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多