Laravel:在“query-builder”或“eloquent”中更改原始查询
Posted
技术标签:
【中文标题】Laravel:在“query-builder”或“eloquent”中更改原始查询【英文标题】:Laravel: change a raw query in a "query-builder" or "eloquent" one 【发布时间】:2016-07-25 04:40:11 【问题描述】:我有这个运行良好的 Laravel 查询生成器 sn-p:
$records = DB::table('users')
->select(
DB::raw('users.*, activations.id AS activation,
(SELECT roles.name FROM roles
INNER JOIN role_users
ON roles.id = role_users.role_id
WHERE users.id = role_users.user_id LIMIT 1)
AS role')
)
->leftJoin('activations', 'users.id', '=', 'activations.user_id')
->where('users.id', '<>', 1)
->orderBy('last_name')
->orderBy('first_name')
->paginate(10);
有没有办法避免使用原始查询并获得相同的结果?换句话说,我怎样才能以更“查询构建器”的风格编写它?我也可以将其翻译成 Eloquent 查询吗?
谢谢
【问题讨论】:
【参考方案1】:您可以使用selectSub
方法进行查询。
(1)首先创建角色查询
$role = DB::table('roles')
->select('roles.name')
->join('roles_users', 'roles.id', '=', 'role_users.role_id')
->whereRaw('users.id = role_users.user_id')
->take(1);
(2) 第二次添加$role
子查询为role
DB::table('users')
->select('users.*', 'activations.id AS activation')
->selectSub($role, 'role') // Role Sub Query As role
->leftJoin('activations', 'users.id', '=', 'activations.user_id')
->where('users.id', '<>', 1)
->orderBy('last_name')
->orderBy('first_name')
->paginate(10);
输出 SQL 语法
"select `users`.*, `activations`.`id` as `activation`,
(select `roles`.`name` from `roles` inner join `roles_users` on `roles`.`id` = `role_users`.`role_id`
where users.id = role_users.user_id limit 1) as `role`
from `users`
left join `activations` on `users`.`id` = `activations`.`user_id`
where `users`.`id` <> ?
order by `last_name` asc, `first_name` asc
limit 10 offset 0"
【讨论】:
哦,selectSub()!!!为什么文档中的任何地方都没有提到它??? :-/ 我还看到 whereRaw() 的东西:使用原始查询是实现结果的唯一方法?我想尽可能避免原始查询... @Ivan 你可以使用普通的where
方法和Illuminate\Database\Query\Expression
。 whereRaw('users.id = role_users.user_id')
到 where('users.id', '=', new Illuminate\Database\Query\Expression('
role_users.
user_id'))
非常感谢! :-)以上是关于Laravel:在“query-builder”或“eloquent”中更改原始查询的主要内容,如果未能解决你的问题,请参考以下文章
Laravel - 在数据库中保存或插入图像数组 - Laravel
Laravel5:获取 Laravel 应用程序的基本 url 或 home url [重复]