Laravel 查询 orderBy pivot table 值

Laravel query orderBy pivot table value

我遇到了无法解决的问题。

我有两个模型 User & Orgs 它们通过 belongsToMany 关系由枢轴 table user_org 界定。 一个用户可以是多个组织的成员,一个组织可以有多个用户。

在我的控制器中我设计了一个查询: $users = User::query();

我想根据各种过滤器获得 $users,应用过滤器没有问题,如果他们有一个 "VIP" 组织,则通过 orderByRaw("CASE WHEN org_id = X THEN 1 ELSE 2 END")[=15= 的一些权重按组织排序]

[编辑] 完整查询在这里:

$users = User::query();
$queryOrder = "CASE WHEN org_id = 13 THEN 1 "; 
$queryOrder .= "WHEN org_id = 14 THEN 2 "; 
$queryOrder .= "ELSE 3 END"; 

$users = $users->join('user_org', 'user_org.user_id', '=', 'users.id')->orderByRaw($queryOrder);

添加 distinct() 没有成功。

问题,查询结果给我一些重复项,因为用户可以属于多个组织。 我无法对用户进行排序,首先是属于 VIP 组织的用户。

你有什么线索可以告诉我吗?

非常感谢!

添加一个 distinct clause 怎么样?

$users = User::query(...)->distinct()->get();

仅供参考,这个问题让我想起了a recent Laracon talk。他用了'orderBySub'。这可能是您的替代选择。

最后我以不同的方式解决了问题。 由于内部连接导致 distinct 不起作用,因此在更好的情况下顺序会丢失。

所以我创建了一个 "score" 计算列,以便按 user_id 和 max(score) 进行分组。

请求如下:

            $users = $users->join(
                    DB::raw("(select id, score from (
                                select user_id as id, MAX(CASE WHEN org_id = 13 THEN 5 WHEN org_id = 14 THEN 4 ELSE 0 END) as score 
                                FROM `user_org`
                                group by user_id
                                order by score DESC
                                ) as x)
                            as d"), function($join){
                    $join->on("d.id","=","users.id");
            });

感谢您的回答和帮助! 干杯