【问题标题】:How to get 3 items from the pivot table via Eloquent (Laravel)?如何通过 Eloquent (Laravel) 从数据透视表中获取 3 个项目?
【发布时间】:2018-07-08 13:08:11
【问题描述】:

一点业务逻辑:1 家公司可能有许多不同角色的用户。 1 位用户在公司中可能只有 1 个角色。

在数据库中,我有一个数据透视表company_user_roles。有 3 个字段:company_id, user_id, role_id。然后我有一个User 模型和belongsToMany 关系来获取用户的公司:

public function companies()
    {
        return $this->belongsToMany(
         'App\Company', 
         'company_user_roles', 
         'user_id', 
         'company_id'
        );
    }

$user->companies 返回公司集合。但是每个公司都没有用户的角色。对于每家公司,我只有这个(这似乎是意料之中的):

#attributes: array:4 [▼
        "id" => 1
        "name" => "Company name"
        "created_at" => "2018-07-08 15:45:40"
        "updated_at" => "2018-07-08 15:45:42"
]

但我不明白如何为每个公司获取用户的角色。我想得到这样的东西:

#attributes: array:4 [▼
            "id" => 1
            "name" => "Company name"
            "role" => [
              "id": 1,
              "name": "owner"
            ]
            "created_at" => "2018-07-08 15:45:40"
            "updated_at" => "2018-07-08 15:45:42"
    ]

或类似的东西,但无需对数据库进行额外查询。这种情况下如何实现这个逻辑?

【问题讨论】:

    标签: php laravel eloquent foreign-keys


    【解决方案1】:

    有一种解决方案可以在您的pivot 模型CompanyUserRole 中添加belongsTo 关系 但是您无法使用即时加载从您的枢轴加载该belongsTo 关系。 第二种解决方案是使用hasMany 关系,当您在数据透视表中有超过 2 个外键时。

    用户模型

    public function roleUserCompanies(){
        return $this->hasMany('App\CompanyUserRole'); 
    }
    

    公司模式

    public function roleCompanyUsers(){
        return $this->hasMany('App\CompanyUserRole'); 
    }
    

    公司用户角色模型

    class CompanyUserRole extends Model {
        protected $table = 'company_user_roles';
    
        public function company(){
           return $this->belongsTo('App\Company');
        }
    
        public function user(){
           return $this->belongsTo('App\User');
        }
    
    
        public function role(){
           return $this->belongsTo('App\Role');
        }
    }
    

    获取数据

    $user = User::with('roleUserCompanies', 'roleUserCompanies.company', 'roleUserCompanies.role')->find(1);
    
    foreach($user->roleUserCompanies as $roleUserCompany){
        dd($roleUserCompany->company);
        dd($roleUserCompany->role);
    }
    

    希望对你有帮助

    【讨论】:

    • 锻炼了一番,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2017-10-17
    • 2019-09-29
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 2021-09-10
    相关资源
    最近更新 更多