繁体   English   中英

Laravel eloquent 按关系上的角色名称排序 model

[英]Laravel eloquent sort by role name on relationship model

我遇到了一个问题,我必须根据它们的关系数据对模型集合进行排序/排序。

我有这样的设置:

模型: UserTeamTeamUser用户、 Role

TeamUser model 是 pivot model / 表(包含user_idteam_id 。如果值得一提,我也在使用spatie/laravel-

当我想按他们的 role.name 对团队中的用户进行排序时,我将如何role.name 我说的是 model Team中的users()关系(请参阅下面的代码示例)。 一些用户拥有team-leader角色,而大多数用户拥有team-seller角色。 我试过做一个普通的..->sortBy('role.name')但这似乎不起作用。 如果有人可以帮助我,请提前感谢。

User.php

/**
 * Team relation
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
 */
public function team()
{
    return $this->belongsToMany('App\Team', 'team_users', 'user_id', 'team_id');
}

Team.php

/**
 * User relation
 *
 * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany
 */
public function users()
{
    return $this->belongsToMany('App\User', 'team_users', 'team_id', 'user_id')->withTimestamps();
}

如果要根据嵌套关系列对结果进行排序,则必须使用连接链:

$values = Team::query()
      ->leftJoin('users', 'users.team_id', '=', 'teams.id')
      ->leftJoin('model_has_roles', function ($join) {
          $join->on('model_has_roles.model_id', '=', 'users.id')
               ->where('model_has_roles.model_type', '=', 'app\Models\User');
      })
      ->leftJoin('roles', 'roles.id', '=', 'model_has_roles.role_id')
      ->orderBy('roles.name')
      ->get();

我已经尝试过了,它工作得很好。

请注意,如果您想按多列排序,您可以根据需要添加“orderBy”子句:

->orderBy('roles.name', 'DESC')->orderby('teams.name', 'ASC') //... ext

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM