在laravel中使用orderbyraw()然后使用orderby()

llycmphe  于 2021-06-15  发布在  Mysql
关注(0)|答案(2)|浏览(1015)

是否可以使用以下orderbyraw()。此orderbyraw()以与where()相同的顺序返回产品。现在只是orderbyraw order中的结果,而不是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
xtupzzrd

xtupzzrd1#

是的,你能做到。每个 orderByRaw 以及 orderBy 子句返回查询生成器,以便可以将它们链接起来。如果输出 ->toSql() 最后,您可以看到生成的输出。

ig9co6j1

ig9co6j12#

让我们设想一个简单的情况—您需要编写一个有说服力的查询,并按两列之差对结果排序。或者其他一些计算。是时候应用原始查询了!
简单订购者:

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

现在,如果我们需要按更新的\u at和创建的\u 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()

希望有帮助!

相关问题