Laravel查询生成器orderBy不排序

时间:2018-08-06 12:21:32

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

我正在使用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()来获取原始查询在任何时候都不会生成联接查询。

执行此操作的正确方法是什么?

这确实很棘手,感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您应该尝试以下操作:

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

答案 2 :(得分:-1)

您没有提到哪个表具有first_name列,因此您必须定义表名。 试试这个:

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