1

私はの完全なタスクを持っていて、これからの作業はdatetimeであり、今後の作業はdatetimeです。Laravel Query Builder:日付順に結果を並べ替えるにはどうすればいいですか?まず、将来の日付で昇順で、次に過去の日付で降順でソートしますか?

タスクを取得中に、昇順(現在から未来へ)と過去のタスク(降順)(今から過去)を並べて表示します。

public function getTasks() 
{ 
     $futureTasks = Task::whereDate('datetime', '>', Carbon::now())->orderBy('datetime', 'asc')->get(); 
     $pastTasks = Task::whereDate('datetime', '<', Carbon::now())->orderBy('datetime', 'desc')->get(); 
     $tasks  = array_merge($futureTasks, $pastTasks); 
     $response = ['tasks' => $tasks]; 
     // return... 
} 

私は次のエラーを取得しています:

array_merge(): Argument #1 is not an array

私はarray_push関数の引数の順序を逆にした場合、私はまだ同じエラーを取得します。

public function getTasks() 
{ 
     $futureTasks = Task::whereDate('datetime', '>', Carbon::now())->orderBy('datetime', 'asc')->get(); 
     $pastTasks = Task::whereDate('datetime', '<', Carbon::now())->orderBy('datetime', 'desc')->get(); 
     $tasks  = array_merge($pastTasks, $futureTasks); 
     $response = ['tasks' => $tasks]; 
     // return... 
} 

また、array_mergeを使用せずにfutureTasksまたはpastTasksのみを取得すると、目的の出力が得られます。

public function getTasks() 
{ 
     $futureTasks = Task::whereDate('datetime', '>', Carbon::now())->orderBy('datetime', 'asc')->get(); 

     $response = ['tasks' => $futureTasks]; 
     // return... 
} 

私はここで間違っていますか?あなたのお時間をありがとうございました。

答えて

1

両方の結果がコレクションです。コレクションmergeメソッドを使用できます。あなたがwhereDate条件を使用しているので

public function getTasks() 
{ 
    $futureTasks = Task::whereDate('datetime', '>', Carbon::now()) 
     ->orderBy('datetime', 'asc') 
     ->get(); 

    $pastTasks = Task::whereDate('datetime', '<', Carbon::now()) 
     ->orderBy('datetime', 'desc') 
     ->get(); 

    $tasks = $futureTasks->merge($pastTasks); 
    $response = compact('tasks'); 
    // return... 
} 

、あなたはあなたのクエリに基づいて、現在の日付からのすべてのデータが欠落しています。それを確認したいかもしれません。

+1

これは完全に機能します。あなたが提案したように、私はちょうどその日ではなく、分と秒でソートするために 'whereDate'ではなく' where'に切り替えました。非常に義務づけられた@Sandeesh。 – anonym

+0

@anonym問題なし:) – Sandeesh

関連する問題