laravel 当急切加载时,

yv5phkfx  于 2023-11-20  发布在  其他
关注(0)|答案(3)|浏览(83)

有没有一种方法在即时加载时给Eloquent关系取别名?例如,我可能有一个如下的查询。

User::with(['roles' => function ($query) { $query->where('type', ADMIN); }]);

字符串
但是,如果我也想立即加载状态为ACTIVE的角色,该怎么办呢?我能想到的唯一方法是在User模型上复制角色关系,并为它给予不同的名称。

User::with([
  'roles' => function ($query) { $query->where('type', ADMIN); },
  'otherRoles' => function ($query) { $query->where('status', ACTIVE) }]
);


我可以在我的用户模型上使用adminRolesactiveRoles这样的方法,但这并不是我想要的,因为有太多可能的参数。

kx1ctssn

kx1ctssn1#

你已经表明你不想在你的用户模型上有额外的方法,但是这是除了使用闭包之外的最好方法,你可以通过让你的新方法(如adminRoles)利用现有的关系方法和相关模型提供的作用域来改进代码。

class User extends Eloquent 
{
    public function roles()
    {
        return $this->hasMany(Role::class);
    }

    public function adminRoles()
    {
        return $this->roles()->admin();
    }
}

字符串
然后定义要在Role模型上使用的作用域。

class Role extends Eloquent
{
    public function scopeAdmin($query)
    {
        $query->where('type', static::ADMIN);
    }
}


您现在可以立即加载这些作用域关系。

User::with('adminRoles')->get();

qzlgjiam

qzlgjiam2#

不幸的是,在Laravel(8.x)中,当前不可能实现即时加载时的别名关系。看起来它不会在不久的将来实现,因为Taylor已经关闭了两个PR。
https://github.com/laravel/framework/pull/37656#issuecomment-870604176
https://github.com/laravel/framework/pull/31976#issuecomment-599538731

3htmauhk

3htmauhk3#

resolveRelationUsing怎么样?你可以在你的函数中动态创建你的自定义关系名称:

User::resolveRelationUsing('otherRoles', function (User $userModel) {
    return $userModel->belongsTo(Role::class, 'role_id');
});

字符串
然后立即加载otherRoles关系:

User::with([
  'roles' => function ($query) { $query->where('type', ADMIN); },
  'otherRoles' => function ($query) { $query->where('status', ACTIVE) }]
);

相关问题