【发布时间】:2015-01-24 10:57:13
【问题描述】:
这是一个简化的用例,只是为了说明我想要实现的目标:
在纯 SQL 中考虑这个查询:
SELECT url, 1 AS active
FROM `modules`
WHERE 1
如何使用查询生成器添加常量活动列?
这是我的查询生成器,没有额外的列:
DB::table('modules')
->get(['url']);
【问题讨论】:
这是一个简化的用例,只是为了说明我想要实现的目标:
在纯 SQL 中考虑这个查询:
SELECT url, 1 AS active
FROM `modules`
WHERE 1
如何使用查询生成器添加常量活动列?
这是我的查询生成器,没有额外的列:
DB::table('modules')
->get(['url']);
【问题讨论】:
我们可以在 \Illuminate\Database\Query\Builder::selectSub 方法的第一个参数作为 raw SQL 或 Closure 或 \Illuminate\Database\Query\Builder 的 select 中添加子查询或“自定义列”。更好的解决方案是closure 或Builder。
在您的情况下,它将是:
$modules = DB::table('modules')->select('url')
->selectSub(function ($query) {
$query->selectRaw('1');
}, 'active')
->get();
在Laravel 5.5 上测试。关闭$query 是\Illuminate\Database\Query\Builder 的子查询对象。准备好的 SQL 将是:
select `url`, (select 1) as `active` from `modules`
扩展示例...如果我们对模块使用App\Module eloquent,我们需要使用id > 5 获取模块的url 和它们的子模块的count,我们可以写下一个:
$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();
准备好的 SQL 将是:
select `url`,
(select COUNT(*) from `submodules`
where `id` > ? and `modules`.`id` = `submodules`.`module_id`)
as `countOfSubModules`
from `modules`
或者您可以使用 raw sql 编写示例:
$sql = 'SELECT 1';
$modules = DB::table('modules')->select('url')->selectSub($sql, 'active')->get();
那么准备好的 SQL 将是:
select `id`, (SELECT 1) as `active` from `modules`
获取所有列必须使用select('*'):
App\Module::select('*')->selectSub($sql, 'text')->get();
不是:
App\Module::selectSub($sql, 'text')->get();
【讨论】:
最简单的方法是使用 DB::raw
DB::table('modules')->get(['url', DB::raw('1 as active')]);
【讨论】:
Laravel Eloquent 有非常灵活的查询构建器。
您可以指定要返回的列:
$users = DB::table('modules')->select('1 as active')->get(['url']);
【讨论】:
modules中选择1作为active)
['url']。
Column not found: 1054 Unknown column '1' in 'field list'