【问题标题】:OrderByRaw() then orderBy() in LaravelLaravel 中的 OrderByRaw() 然后 orderBy()
【发布时间】:2019-05-21 05:36:28
【问题描述】:

是否可以使用以下 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。为什么这不起作用?

选择 * 来自`产品` WHERE `id` IN (?, ?, ?, ?, ?) 按字段排序(id,?,?,?,?,?), `视图` DESC, `created_at` DESC

【问题讨论】:

  • 我想你想写'desc'而不是'des'。这可能是问题所在。

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


【解决方案1】:

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

【讨论】:

  • 这个答案更适合作为问题下的评论。你怎么看?
  • 这是我在执行 toSql() 时得到的 SQL。为什么这不起作用? SELECT * FROM products WHERE id IN (?, ?, ?, ?, ?) ORDER BY Field(id, ?, ?, ?, ?, ?), views DESC, created_at DESC跨度>
  • 它表明原始查询正在运行,但您的原始查询中有错字。 des 应该是 desc。在sqlfiddle.com 中构建您的表格,我们可以更好地看到它。
【解决方案2】:

让我们想象一个简单的情况——你需要编写一个 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()

希望有帮助!

【讨论】:

  • 谢谢,但我了解 orderByRaw() 函数。唯一不起作用的是 orderByRaw 和 orderBy 的链接。所以首先按 id 的顺序排序,然后按视图排序。
  • 或者如果你知道这一点。只是我想展示它是如何工作的,它将在未来对某人有用。我更新了我的答案!!谢谢
猜你喜欢
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 2015-10-28
  • 2020-09-27
相关资源
最近更新 更多