我有无法解决的麻烦。
我有两个模型用户和组织 它们被数据透视表 user_org 约束,它们之间通过一个EmiratesToMany关系。 一个用户可以是许多组织的成员,而一个组织可以有许多用户。
在我的控制器中,我编写了一个查询:
$users = User::query();
我想根据各种过滤器来获得$ users,应用过滤器没有问题,如果他们有一个“ VIP”组织,则可以通过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组织用户。
你对我有什么线索吗?
非常感谢!
答案 0 :(得分:0)
添加distinct clause怎么样?
$users = User::query(...)->distinct()->get();
仅供参考,这个问题使我想起a recent Laracon talk。他使用了“ orderBySub”。这可能是您的替代选择。
答案 1 :(得分:0)
最后,我对问题的处理方式有所不同。 由于内部联接导致区分不起作用,因此在更好的情况下顺序会丢失。
因此,我创建了一个“得分”计算列,以便按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");
});
感谢您的回答和帮助! 干杯