Zar*_*Dev 13 php sql laravel eloquent
这是一个简化的用例,仅用于说明我想要实现的目标:
在纯SQL中考虑此查询:
SELECT url, 1 AS active
FROM `modules`
WHERE 1
Run Code Online (Sandbox Code Playgroud)
如何使用查询生成器添加常量活动列?
这是我的查询生成器,没有额外的列:
DB::table('modules')
->get(['url']);
Run Code Online (Sandbox Code Playgroud)
tur*_*two 21
最简单的方法是使用DB :: raw
DB::table('modules')->get(['url', DB::raw('1 as active')]);
Run Code Online (Sandbox Code Playgroud)
Art*_*tov 10
我们可以在select中添加子查询或"自定义列",\Illuminate\Database\Query\Builder::selectSub方法的第一个参数为raw SQL或Closure,或\Illuminate\Database\Query\Builder.更好的解决方案是关闭或Builder.在你的情况下,它将是:
$modules = DB::table('modules')->select('url')
->selectSub(function ($query) {
$query->selectRaw('1');
}, 'active')
->get();
Run Code Online (Sandbox Code Playgroud)
经过测试Laravel 5.5.在闭包中$query是\Illuminate\Database\Query\Builder子查询的对象.准备好的SQL将是:
select `url`, (select 1) as `active` from `modules`
Run Code Online (Sandbox Code Playgroud)
扩展示例...如果我们App\Module对模块使用eloquent并且我们需要获取url模块count及其子模块id > 5,我们可以写下:
$modules = App\Module::select('url')
->selectSub(function ($query) {
/** @var $query \Illuminate\Database\Query\Builder */
$query->from('submodules')
->selectRaw('COUNT(*)')
->where('id', '>', 5)
->whereRaw('`modules`.`id` = `submodules`.`module_id`');
}, 'countOfSubModules')
->get();
Run Code Online (Sandbox Code Playgroud)
准备好的SQL将是:
select `url`,
(select COUNT(*) from `submodules`
where `id` > ? and `modules`.`id` = `submodules`.`module_id`)
as `countOfSubModules`
from `modules`
Run Code Online (Sandbox Code Playgroud)
或者你可以用raw sql编写你的例子:
$sql = 'SELECT 1';
$modules = DB::table('modules')->select('url')->selectSub($sql, 'active')->get();
Run Code Online (Sandbox Code Playgroud)
然后准备SQL将是:
select `id`, (SELECT 1) as `active` from `modules`
Run Code Online (Sandbox Code Playgroud)
要使所有列必须使用select('*'):
App\Module::select('*')->selectSub($sql, 'text')->get();
Run Code Online (Sandbox Code Playgroud)
不是:
App\Module::selectSub($sql, 'text')->get();
Run Code Online (Sandbox Code Playgroud)