【问题标题】:Laravel query builder orderBy not orderingLaravel 查询构建器 orderBy 不排序
【发布时间】:2018-08-06 12:21:32
【问题描述】:

我正在开发一个使用 Laravel query builder 的项目,但在尝试订购数据时遇到了麻烦。首先,我需要按名称排序,该名称是“用户”表中的一个连接列。

我的代码:

        $Records = Tickets::with('User', 'Session', 'Session.Course');
        $Records = $Records->orderBy('first_name', 'desc'); //generates an error as no first_name column exists in the current query, although the first name is rendered in the view!
        $Records = $Records->get();

我不确定查询生成器是如何建立关联来获取用户名的,因为调用 toSql() 来获取原始查询在任何时候都不会生成连接查询。

这样做的正确方法是什么?

这真的很棘手,我很感激任何帮助。

【问题讨论】:

  • 你能告诉我们你在$Records->orderBy('grade', 'desc');之前的代码吗?
  • 好的,请查看编辑后的帖子。

标签: laravel orm eloquent query-builder laravel-query-builder


【解决方案1】:

with() 不会将 JOIN 添加到查询中,它会为每个关系执行单独的查询。

您可以自己添加JOIN

$Records = Tickets::select('tickets.*')
    ->join('users', 'users.id', '=', 'tickets.user_id')
    ->orderBy('users.first_name', 'desc')
    ->get();

在 Laravel 5.2.32 中,您可以使用修改后的 withCount() 重用关系:

$Records = Tickets::withCount(['User as first_name' => function($query) {
    $query->select('first_name');
}])->orderBy('first_name', 'desc')->get();

这会选择带有子查询的users.first_name

select `tickets`.*,
  (select `first_name`
   from `users`
   where `tickets`.`user_id` = `users`.`id`) as `first_name`
from `tickets`
order by `first_name` desc

【讨论】:

  • 感谢您的回复!这很有帮助。如果我需要创建“点击排序”功能并且几乎所有来自连接的列都需要可排序,该怎么办?
  • 一个查询可以同时按多列排序吗?
  • 不,一次只有一个。
  • 您可以将'first_name' 替换为变量$column
  • 您的代码不起作用。生成以下错误:Call to undefined method Illuminate\Database\Query\Builder::withCount()
【解决方案2】:

你应该试试这个:

$Records = Tickets::select('tickets.*')
    ->join('users', 'tickets.user_id', '=', 'users.id')
    ->orderBy('users.first_name', 'desc')
    ->get();

【讨论】:

  • 感谢您的回复。这实际上工作得很好!由于某种原因,不将 '=' 作为参数传递给连接函数不起作用...
【解决方案3】:

你没有提到哪个表有first_name 列,所以你必须定义表名。 试试这个:

$Records->orderBy('users.first_name', 'desc');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2019-04-29
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多