【问题标题】: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?Laravel 查询生成器:如何按日期对结果进行排序 - 首先按未来日期升序,然后按过去日期降序?
【发布时间】:2017-11-05 05:44:03
【问题描述】:

我有一个模型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...
}

如果我只检索没有 array_merge 的 futureTasks 或 pastTasks,我会得到所需的输出。

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

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

我在这里做错了什么?非常感谢您的宝贵时间。

【问题讨论】:

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


    【解决方案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 条件,因此根据您的查询,您会丢失当前日期的所有数据。你可能想检查一下。

    【讨论】:

    • 效果很好。就像你建议的那样,我也切换到 where 而不是 whereDate 以便按分钟和秒进行排序,而不仅仅是一天。非常感谢,@Sandeesh。
    • @anonym 没问题 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多