簡體   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