Laravel 查询生成器:如何按日期对结果进行排序 - 首先按未来日期升序排列,然后按过去日期降序排列?
Laravel Query Builder: How do I sort results by date - first with ascending order by future dates and then by descending order by past dates?
我有一个模型 tasks
,过去 datetime
已完成任务,未来 datetime
即将完成任务。
在检索任务时,我想显示即将到来的任务按升序排列(从现在到将来)和过去的任务按降序排列(从现在到过去)。
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...
}
我在这里做错了什么?非常感谢您的宝贵时间。
这两个结果是一个集合。您可以使用集合 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
条件,因此根据您的查询,您丢失了当前日期的所有数据。你可能想检查一下。
我有一个模型 tasks
,过去 datetime
已完成任务,未来 datetime
即将完成任务。
在检索任务时,我想显示即将到来的任务按升序排列(从现在到将来)和过去的任务按降序排列(从现在到过去)。
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...
}
我在这里做错了什么?非常感谢您的宝贵时间。
这两个结果是一个集合。您可以使用集合 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
条件,因此根据您的查询,您丢失了当前日期的所有数据。你可能想检查一下。