是否可以使用以下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
让我们想象一个简单的情况 - 您需要编写一个 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 子句而不更改其中的任何内容,因此最终查询将是:
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()
希望有帮助!
是的,你可以这么做。 每个
orderByRaw
和 orderBy
子句都会返回查询生成器,因此您可以将它们链接起来。 如果最后输出->toSql()
,就可以看到生成的输出。