【问题标题】:Order by column value按列值排序
【发布时间】:2020-02-25 14:16:35
【问题描述】:

我有一个搜索功能,它返回电影并按时间戳对其进行排序,我有一个名为 status 的过滤器,其字符串值为 onlineoffline 我希望此过滤器显示包含两个结果的配置文件但是所有在线的都在最下面,离线的在底部

您能否按列字符串值排序,以便它只返回顶部在线和底部离线的电影?像下面的东西

->orderBy('status', 'online', desc)

查询

以下是我当前的查询,哪个按时间戳排序会添加另一个 orderBy 就足以解决问题?

 Film::select('films.*')
        ->when($filters->input('status'), function ($query, $status) {
               $query->where('status', $status);
            }
        })
        ->orderBy('films.updated_at', 'desc')
        ->distinct()
        ->get();

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    您可以根据需要多次调用 orderBy()。

     Film::select('films.*')
                ->when($filters->input('status'), function ($query, $status) {
                    if ($status !== FilmStatus::OFFLINE) {
                        $query->where('status', $status);
                    }
                })
                ->orderBy('films.updated_at', 'desc')
                ->orderBy('status', 'ASC')
            ->distinct()
            ->get();
    

    【讨论】:

    • 是的,我可以按列排序,但我如何确保我按列字符串值排序,即onlineoffline 的结果出现在下面
    • 因为它对字符串进行排序。并且“在线”排在字符串“离线”的前面,按升序排列。让我们试试
    【解决方案2】:

    您可以像这样使用条件排序:

    Film::select('films.*')
        ->when($filters->input('status'), function ($query, $status) {
                $query->where('status', $status);
        })
        ->orderBy(\DB::raw("
            CASE WHEN status = 'online' THEN 1 ELSE 0 END DESC
        "))
        ->distinct()
        ->get();
    

    在上面的查询中,如果状态是在线,它将在顶部,如果状态是其他,它将在下方。 希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 2012-04-06
      • 2021-01-24
      • 2012-06-27
      相关资源
      最近更新 更多