Laravel 中的 OrderByRaw() 然后 orderBy()

问题描述 投票:0回答:2

是否可以使用以下orderByRaw()。此 orderByRaw() 以与 whereIn() 相同的顺序返回产品。现在只有 orderByRaw 顺序的结果,而不是 orderBy()

是否可以将这些结合起来:

$ids;
$placeholders = implode(',',array_fill(0, count($ids), '?'));
产品::whereIn('id', $ids)->orderByRaw("field(id,{$placeholders})" ,$ids)->orderBy('views', 'des')->orderBy('created_at' , 'des')->get();

编辑: 这是我执行 toSql() 时得到的 SQL。为什么这不起作用?

选择* 
来自“产品” 
WHERE `id` IN (?, ?, ?, ?, ?) 
按字段排序(id, ?, ?, ?, ?, ?), 
          `视图` DESC, 
          `创建于` DESC 
php mysql laravel eloquent sql-order-by
2个回答
1
投票

让我们想象一个简单的情况 - 您需要编写一个 Eloquent 查询并根据两列的差异对结果进行排序。或者其他一些计算。是时候应用原始查询了!

简单订购:

User::where('created_at', '>', '2016-01-01')
  ->orderBy('updated_at', 'desc')
  ->get();

现在,如果我们需要按 updated_atcreated_at 之间的差异进行排序怎么办?看起来像这样:

User::where('created_at', '>', '2016-01-01')
  ->orderByRaw('(updated_at - created_at) desc')
  ->get();

这个 orderByRaw() 方法在官方 Laravel 文档中没有提到,将应用 order by 子句而不更改其中的任何内容,因此最终查询将是:

select * from users 
  where created_at > '2016-01-01' 
  order by (updated_at - created_at) desc

更新我的答案 替换这个

->orderBy('views', 'des')->orderBy('created_at', 'des')->get()

 ->orderBy('views', 'desc')->orderBy('created_at', 'desc')->get()

希望有帮助!


0
投票

是的,你可以这么做。 每个

orderByRaw
orderBy
子句都会返回查询生成器,因此您可以将它们链接起来。 如果最后输出
->toSql()
,就可以看到生成的输出。

© www.soinside.com 2019 - 2024. All rights reserved.