2017-06-27 10 views
0

モデルを2つの列で並べ替える方法が必要です(ただし、x、yの順序ではありません)。私はpriorityが設定されていないときに結果をモデル化し、created_at標準化キーであるべき標準であるpriority列を持っています。私がこれをするために見つけた唯一の方法は、組合と一緒だった。Laravelスコープとユニオン

(SELECT * FROM `charts` WHERE priority IS NOT NULL ORDER BY priority ASC) 
UNION (SELECT * FROM `charts` WHERE priority IS NULL AND created_at IS NOT NULL ORDER BY CREATED_AT ASC) 
UNION (SELECT * FROM `charts` WHERE created_at IS NULL) 

だから私のような何かをしようとした:

public function scopeSortPriority($query) 
{ 
    return $query->whereNotNull('priority') 
     ->orderBy('priority') 
     ->union($query->whereNull('priority') 
      ->whereNotNull('created_at') 
      ->orderBy('created_at')) 
     ->union($query->whereNull('priority') 
      ->whereNull('created_at')); 
} 

をしかし、それは悲しげに動作しません。このようなクエリでは

私はSQLで何をしたいのですか?さもなければ - 私はそれを動作させるためにこの範囲をどのように再構築すべきですか?

+0

私はあなたに優先度を設定示唆しますあなたが '優先順位desc、created_at'で注文することができるように、すべてのモデル(それがほとんどの場合0であっても)。優先度が同じ場合に作成されます。 – apokryfos

答えて

1

問題は、あなたのユニオンで$queryを使用していることです。

あなたのクエリとあなたの労働組合の共通部分はオールウェイズあなたが行うことができます\DB::table('charts')になることがわかっている場合:

$query->whereNotNull('priority') 
    ->orderBy('priority') 
    ->union(\DB::table('charts')->whereNull('priority') 
     ->whereNotNull('created_at') 
     ->orderBy('created_at')) 
    ->union(\DB::table('charts')->whereNull('priority') 
     ->whereNull('created_at')); 

$queryが同じになりますが、あなたが行うことができます変更することができた場合:

$query2 = clone $query; 
    $query3 = clone $query; 

    $query->whereNotNull('priority') 
    ->orderBy('priority') 
    ->union($query2->whereNull('priority') 
     ->whereNotNull('created_at') 
     ->orderBy('created_at')) 
    ->union($query3->whereNull('priority') 
     ->whereNull('created_at')); 
両方の場合

SQLの出力は次のようになります。

(select * from `charts` where `priority` is not null order by `priority` asc) union (select * from `charts` where `priority` is null and `created_at` is not null order by `created_at` asc) union (select * from `charts` where `priority` is null and `created_at` is null) 
関連する問題