2017-04-17 17 views
0

laravelコレクションを並べ替えることができないので、empty/nullのデータが最後になります。 (usortについて混乱しているビット)null/emptyを最後に残してlaravelコレクションを並べ替える

私が持っているほとんどのものは、注文する必要があるtimes/timestampsの束です。一部の行にはその列がない場合があります。

データが表示されますASC/ascendingempty/nullのデータが最後に表示されます。

$collection->sortBy('timestamp')空のフィールドを処理する方法はうまく分類されていますが、わかりません。

data

表は次のようになります。

$data = $data->sort(function($a, $b) use ($sortBy) { 
     if ($a->{$sortBy} and $b->{$sortBy}) return 0; 
     return ($a->{$sortBy} > $b->{$sortBy}) ? -1 : 1; 
    }); 

ランダムコード私は正しく動作させることができないインターネットから試しました。 $sortByには、並べ替えるフィールド名が含まれています(変更される可能性があるため) 不良コードは空/ NULLデータを処理しますが、その順序は不良です。 faulty

+0

ソートに使用しているコードを追加してください。 –

答えて

1

試してみてください。

$collection->sortBy('-timestamp')

それは動作しますか?

+0

このポストは、私が思っていたことに感謝しました。 sortBy( '​​ - timestamp')を使用する代わりに、各エントリに対して別の変数を作成しました。たとえば、デフォルト値で割り当てられたtimestamp_order、-10000の乱数、およびそのデータがあればその変数を上書きします(タイムスタンプはnullではありません)。または空)。 $ collection-> sortBy( '​​timestamp_order')でソート – m4gix1

+0

私はその考えが気に入らないが、うまくいきます:)私の提案がうまくいかない場合は、次の例のようにCASEを試してみてください: 'ORDER BY (タイムスタンプがNULLの場合、1 ELSE 0 ENDの場合)、タイムスタンプ ' ここをクリックしてください:http://stackoverflow.com/questions/5993109/order-by-asc-with-nulls-at-the-bottom –

+0

あまりにもそのアイデアがあまり好きではなかったが、私は多くの関係atmと限られた時間枠を持っているので、私は代わりにコレクションを並べ替えています。乱数をCarbon :: now() - > addYear() - > toDateTimeString()に変更しました。代わりに、他のタイムスタンプより古いため、最後に表示されます。 – m4gix1

0

timestampはUNIXのタイムスタンプとみなします。

あなたはこのようにそれを並べ替えることができます。

$sorted = $collection->sortByDesc('timestamp'); 
+0

これは私が達成したいとは思っていませんが、ASC/Ascendingの結果が空/空のデータが最後の間に表示されるようにしたいと思います。 – m4gix1

0

closureでsort()を使用する必要があります。以下では、最後にタイムスタンプASCをNULLでソートします。

$sorted = $collection->sort(function ($a, $b) { 
    if (!$a->timestamp) { 
     return !$b->timestamp ? 0 : 1; 
    } 
    if (!$b->timestamp) { 
     return -1; 
    } 
    if ($a->timestamp == $b->timestamp) { 
     return 0; 
    } 

    return $a->timestamp < $b->timestamp ? -1 : 1; 
}); 
関連する問題