1

我有一個模型tasks與完成任務與datetime在過去和即將到來的任務與datetime在未來。Laravel查詢生成器:如何按日期排序結果 - 先按未來日期的升序排序,然後按過去日期的降序排序。

在檢索任務時,我想顯示按升序排列即將到來的任務(從現在到未來)以及過去按降序排列(從現在到過去)的任務。

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... 
} 

,如果我只檢索futureTasks或pastTasks沒有array_merge,我得到所需的輸出。

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

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

我在這裏做錯了什麼?非常感謝您的時間。

回答

1

這兩個結果都是一個集合。您可以使用集合merge方法。

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... 
} 

由於您使用的whereDate條件,你錯過了從根據您的查詢本日的所有數據。你可能想檢查一下。

+1

完美的作品。就像你建議的那樣,我也切換到了「where」而不是'whereDate',以便不僅僅是一天的幾分鐘和幾秒鐘。非常感謝@Sandeesh。 – anonym

+0

@anonym沒問題:) – Sandeesh