Laravel - 按条目数量排序

时间:2016-05-31 11:51:20

标签: php mysql laravel eloquent

这是question的后续内容。我有一个看起来像这样的查询:

$users = User::leftjoin('role_user', 'users.id', '=', 'role_user.user_id')
              ->select('users.*')
              ->orderBy(DB::raw('role_id IS NULL'))
              ->groupBy('users.id')
              ->orderBy('role_id', 'asc')
              ->get();

当我这样做时,我得到了用户的不同值,并且按asc顺序按角色排序,这个查询的唯一内容是具有两个或更多角色的用户落后于只有一个角色的用户角色。例如,用户具有id=1id=2的角色,而其他用户只有id=1的角色,该用户将位于列表中具有两个角色的用户之前。我想改变这一点,让用户拥有更多角色,而不只是一个角色。

2 个答案:

答案 0 :(得分:1)

我建议您使用Query ScopesQuerying Relations

class User extends Authenticatable
{
    ...

    public function roles()
    {
        return $this->belongsToMany('Role', 'role_user');
    }

    // Scope users who have a specified role
    public function scopeHasRole($query, $role) {
        return $query->whereHas('roles', function ($q) use ($role) {
            $q->where('id', $role);
        });
    }

    // Scope users who have a set of roles
    public function scopeHasRoles($query, $roles) {
        if (! is_array($roles)) {
            return $this->scopeHasRole($query, $roles);
        }

        return $query->whereHas('roles', function ($q) use ($roles) {
            $q->whereIn('id', $roles);
        });
    }

    // Scope a user who don't have any roles.
    public function scopeDoesntHaveAnyRoles($query) {
        return $query->whereDoesntHave('roles');
    }

}

使用示例:

User::doesntHaveAnyRoles(); // return users don't have any roles.

User::hasRole(1)->orderBy('id', 'asc')->get(); // return users who belongs to role id 1.

User::hasRoles([1, 2, 3]); // return users who have a set of roles.

答案 1 :(得分:0)

以下查询最终为我工作:

User::leftjoin('role_user', 'users.id', '=', 'role_user.user_id')
                               ->select('users.*')
                               ->selectRaw('user_id, count(*) as count')
                               ->orderBy(DB::raw('role_id IS NULL'))
                               ->groupBy('users.id')
                               ->orderBy('count', 'DESC')
                               ->orderBy('role_id', 'asc')
                               ->get();