Laravel5.5 中模型查询时设置的别名与 DB::raw 冲突了,怎样让别名不加表前缀?
需求:用户列表中,需要同时显示用户首次消费的时间及金额,于是写了如下查询:
$users = DB::table('users')
->select(['users.id', 'users.name', 'o.real_amount', DB::raw('MIN(o.created_at) AS order_at')])
->join('orders as o', 'o.user_id', '=', 'users.id')
->whereIn('users.id', [3,4])
->get();
参考了 stockoverflow 中的答案,写的
但是实际调用时,发现所有的别名,都自动加上了表前缀,这样就导致了 DB::raw
中,字段不匹配的错误;输入的SQL如下:
select `pk_users`.`id`, `pk_users`.`name`, `pk_o`.`real_amount`,
MIN(o.created_at) AS order_at
from `pk_users`
inner join `pk_orders` as `pk_o` on `pk_o`.`user_id` = `pk_users`.`id`
where `pk_users`.`id` in (3, 4)
造成了这样一个错误:
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'o.created_at' in 'field list'
请问,这种错误该如何处理,真的要手动给 DB::raw()
中的 o.created_at
改为 pk_o.created_at
吗?
意外查到,说这种方式,效率非常慢,那还有其它更好的实现这种需求的写法吗?
比如,分开查询,先查询用户数据,然后再查询订单数据,之后再用一个foreach
将两个数据关联起来?
看到楼主在思否上面的提问,找到了解决办法 DB::raw('CONCAT('.DB::getTablePrefix().'rel.name, "=", '.DB::getTablePrefix().'rel.real_name) as name')