【问题标题】:Laravel eloquent sort by role name on relationship modelLaravel eloquent 按关系模型上的角色名称排序
【发布时间】:2020-04-13 14:57:48
【问题描述】:

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

我的设置是这样的:

型号: UserTeamTeamUserRole

TeamUser 模型是一个数据透视模型/表(包含user_idteam_id。 如果值得一提,我还使用spatie/laravel-permissions 作为角色。

当我想按role.name 对团队中的用户进行排序时,我将如何进行? 我说的是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();
}

【问题讨论】:

    标签: php laravel eloquent relationship


    【解决方案1】:

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

    $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
    

    【讨论】:

    • 我尝试使用这种方法,但它并没有改变任何关于订单的内容。我目前拥有角色team-seller 的用户始终位于底部。我尝试了 asc 和 desc 顺序。 return $this->belongsToMany('App\User', 'team_users', 'team_id', 'user_id')->with(['roles' => function($q) { $q->orderByDesc('roles.name'); }])->withTimestamps();
    • 我已经更新了我的答案..如果有帮助请告诉我
    • 这行得通,做了一些更改,但我了解了它的工作原理。感谢您花时间帮助我! :D
    • 遗憾的是角色排序对我不起作用,请继续获取Column not found: 1054 Unknown column 'roles' in 'order clause'
    • 你在使用 spatie 权限包@ctf0 吗?
    猜你喜欢
    • 2014-10-10
    • 1970-01-01
    • 2020-01-08
    • 2017-05-07
    • 2021-01-25
    • 2014-06-25
    • 2021-07-14
    • 2018-01-08
    • 2016-02-26
    相关资源
    最近更新 更多