繁体   English   中英

Laravel查询顺序通过数据透视表值

[英]Laravel query orderBy pivot table value

我有无法解决的麻烦。

我有两个模型UserOrgs它们通过数据透视表user_org通过belongsToMany关系来界定。 一个用户可以是许多组织的成员,而一个组织可以有许多用户。

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

我想根据各种过滤器来获取$ users,应用过滤器没有问题,如果它们有一个“ VIP”组织,并通过orderByRaw("CASE WHEN org_id = X THEN 1 ELSE 2 END")进行一些加权, orderByRaw("CASE WHEN org_id = X THEN 1 ELSE 2 END")组织顺序对其进行orderByRaw("CASE WHEN org_id = X THEN 1 ELSE 2 END")

[EDIT]完整查询在这里:

$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组织的用户。

你对我有什么线索吗?

非常感谢 !

添加不重复子句怎么办?

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

仅供参考,这个问题使我想起了最近的Laracon演讲 他使用了“ orderBySub”。 这可能是您的替代选择。

最终,我对问题的处理方式有所不同。 由于内部联接使唯一性不起作用,因此在更好的情况下会丢失顺序。

因此,我创建了一个“得分”计算列,以便按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");
            });

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

暂无
暂无

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

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