Laravel中的OrderByRaw()然后orderBy()

时间:2018-12-20 17:00:52

标签: mysql sql laravel eloquent sql-order-by

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

是否可以将这些组合在一起?

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

编辑: 这是我执行toSql()时获得的SQL。为什么这行不通?

SELECT * 
FROM   `products` 
WHERE  `id` IN ( ?, ?, ?, ?, ? ) 
ORDER  BY Field(id, ?, ?, ?, ?, ?), 
          `views` DESC, 
          `created_at` DESC 

2 个答案:

答案 0 :(得分:0)

是的,您可以这样做。每个orderByRaworderBy子句都返回查询生成器,因此您可以将它们链接在一起。如果最后输出->toSql(),则可以看到生成的输出。

答案 1 :(得分:0)

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

简单的订单依据:

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

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

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

orderByRaw()方法(在Laravel官方文档中未提及)将应用 order by 子句而不更改其中的任何内容,因此最终查询将为:< / p>

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()

希望有帮助!