Laravel查询生成器:如何按日期对结果进行排序 - 首先按未来日期的升序排序,然后按过去日期的降序排序?

时间:2017-06-04 08:32:21

标签: laravel laravel-5 eloquent laravel-5.4 laravel-query-builder

我有一个模型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():参数#1不是数组

如果我颠倒了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 个答案:

答案 0 :(得分:2)

结果都是一个集合。您可以使用集合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条件,因此您根据查询丢失了当前日期的所有数据。你可能想检查一下。