我正在使用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()来获取原始查询在任何时候都不会生成联接查询。
执行此操作的正确方法是什么?
这确实很棘手,感谢您的帮助。
答案 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');