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");
});
感谢您的回答和帮助!
干杯
我遇到了无法解决的问题。
我有两个模型 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");
});
感谢您的回答和帮助! 干杯