当前位置: 首页 > 知识库问答 >
问题:

Laravel-按条目数排序

丌官翰采
2023-03-14

这是对这个问题的跟进。我有一个如下的查询:

$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顺序按角色\u id排序,此查询的唯一问题是具有两个或更多角色的用户位于仅具有一个角色的用户的后面。例如,用户有id=1id=2的角色,而其他用户只有一个id=1的角色,该用户将在列表中有两个角色的用户之前。我想改变这一点,让拥有更多角色的用户超过只有一个角色的用户。

共有2个答案

宁弘亮
2023-03-14

以下查询最终为我工作:

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();
卜季萌
2023-03-14

我建议使用查询范围和查询关系

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.
 类似资料:
  • Position是排行榜中的位置,1是得分最高的用户 GameBoard类有两个方法: submitScore(String uid,int score)每个玩家调用这个方法将他的分数提交到游戏板上。每个玩家/用户只有一个条目,因此,如果玩家多次调用此方法,则存储其最新得分 GetLeaderBoard(字符串uid) 上述代码的问题: 何时(理想情况下,在submitScore()期间)以及如何

  • 问题内容: 我正在尝试做一个标准查询,该查询返回像常见问题一样的stackoverflow中回答最多的问题。 一个问题包含多个答案。 我试图以标准查询返回按每个问题的答案数排序的最常回答的问题。 有人知道我应该在hibernate标准util中使用什么吗? 问题答案: 这将返回一个Object []列表。每个Object []都将问题的ID作为第一个元素,并将此问题的答案数目作为第二个元素。问题按

  • 我想排序结果从数据库由几个colum。我这样尝试: 但它只按名称排序。如何在按名称排序后添加按视图排序。

  • 波乔即是。java表示排行榜中的一个条目。Position是排行榜中的位置,1是得分最高的用户 . 我不知道该用什么谓词来返回5个条目,包括正在搜索的条目。另一个方面是性能,因为排行榜可以有几十万个条目。 *********编辑-1*********** 使用parallelStream()会导致问题吗? 列表条目=LeaderBoardUserEntryMap.EntrySet().Parall

  • 问题内容: 我有一个列表,其中每个元素都是形式。例如,列表的元素可能看起来像这样。 我想通过以下条件对包含描述的元素类型的列表进行排序: 如果两个元素的整数列表(即)的长度不同,则整数列表较小的元素是较小的元素。 否则,如果整数列表的长度相同,则较小的元素是第一个整数的较小整数,这两个元素的整数列表都不同。例如: [[1,1,99,100],-1] <[[1,1,100,1],-1],因为99 <

  • 问题内容: 我试图按表中的列对表中的产品进行排序: 我在商店\产品模型中设置关系: 但是产品没有分类。我得到一个仅适用于表的查询。 如何解决? 问题答案: 急切的加载使用单独的查询,因此您需要为此加入: 子句是为了不将联接的列追加到模型中。 编辑:根据@alexw注释-如果需要,您仍然可以包括联接表中的列。您可以将它们添加到或致电等。