【问题标题】:Alias an Eloquent relationship when eager loading急切加载时为 Eloquent 关系别名
【发布时间】:2019-01-22 21:28:33
【问题描述】:

是否有办法在急切加载时为 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 之类的方法,但这真的不是我想要的,因为有很多可能的参数。

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    您已表明您不想在用户模型上使用其他方法,但这是您除了使用已经使用的闭包之外的最佳方法。您可以通过让 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();
    

    【讨论】:

      【解决方案2】:

      不幸的是,当在 Laravel (8.x) 中当前无法进行预加载时,会出现别名关系。看起来它不会在不久的将来实施,因为 Taylor 已经关闭了两个 PR。

      https://github.com/laravel/framework/pull/37656#issuecomment-870604176

      https://github.com/laravel/framework/pull/31976#issuecomment-599538731

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-30
        • 2021-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-10
        • 2017-01-12
        • 1970-01-01
        相关资源
        最近更新 更多