为了账号安全,请及时绑定邮箱和手机立即绑定

Laravel Eloquent 用于数据透视表,其中一个表有 2 个外键,另一个表有 1 个外键

Laravel Eloquent 用于数据透视表,其中一个表有 2 个外键,另一个表有 1 个外键

PHP
鸿蒙传说 2024-01-19 15:00:46
我有如下表,其中是表role_id的外键,和是表的外键。rolesuser_idsetter_iduserstable 1:+---------------------+| users               |+---------------------+| id                  || name                || email               || password            |+---------------------+table 2:+---------------------+| roles               |+---------------------+| id                  || name                |+---------------------+pivot table:+---------------------+| role_user           |+---------------------+| role_id             || user_id             || setter_id           |+---------------------+我定义的模型:用户型号:class User extends Model{    public $timestamps = false;         public function roles()     {         return $this->belongsToMany(Role::class);     }}好榜样:class Role extends Model{    public $timestamps = false;        public function users()    {        return $this->belongsToMany(User::class);    }}如何更改模型才能获得如下所示的数据?user -> Roles -> setter :用户及其角色以及用户每个角色的setter谢谢...
查看完整描述

2 回答

?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

您将永远无法通过在角色集合中调用 setter 来访问它。


这是错误的:


$user->roles->setter

让我们看一个可行的示例:


foreach($user->roles as $role)

{

    dd($role->pivot->setter)

}


为了做到这一点,您需要更改模型以反映如下内容:


用户


class User extends Model

{

    public $timestamps = false;

    

     public function roles()

     {

         return $this->belongsToMany(Role::class)

            ->using(UserRolePivot::class)

            ->withPivot([

                'role_id',

                'user_id',

                'setter_id',

            ]);

     }

}

角色


class Role extends Model

{

    public $timestamps = false;

    

    public function users()

    {

        return $this->belongsToMany(User::class)

            ->using(UserRolePivot::class)

            ->withPivot([

                'role_id',

                'user_id',

                'setter_id',

            ]);

    }

}


use Illuminate\Database\Eloquent\Relations\Pivot;


class UserRolePivot extends Pivot

{

    protected $fillable = [

        'role_id',

        'user_id',

        'setter_id',

    ];


    public function role()

    {

        return $this->belongsTo(Role::class , 'role_id');

    }


    public function user()

    {

        return $this->belongsTo(User::class , 'user_id');

    }


    public function setter()

    {

        return $this->belongsTo(User::class , 'setter_id);

    }

}


查看完整回答
反对 回复 2024-01-19
?
holdtom

TA贡献1805条经验 获得超10个赞

您可以更新belongsToMany调用以在数据透视表上包含 setter_id,然后通过访问它->pivot->setter_id并使用该 id 检索模型。

return $this->belongsToMany(Role::class)->withPivot('setter_id');

或者(也是我个人的追求)您可以定义一个自定义枢轴模型,并setter()在那里创建一个关系,这样您就可以直接从枢轴检索模型。


查看完整回答
反对 回复 2024-01-19
  • 2 回答
  • 0 关注
  • 20 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信