这是一个简化的用例,只是为了说明我想要实现的目标:
在纯 SQL 中考虑此查询:
SELECT url, 1 AS active
FROM `modules`
WHERE 1
如何使用查询生成器添加常量活动列?
这是我的查询生成器,没有额外的列:
DB::table('modules')
->get(['url']);
原文由 YannPl 发布,翻译遵循 CC BY-SA 4.0 许可协议
We can add subquery or “custom column” in select with first argument of \Illuminate\Database\Query\Builder::selectSub
method as raw SQL
or Closure
, or \Illuminate\Database\Query\Builder
.更好的解决方案是 关闭 或 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`
Extended example… If we use App\Module
eloquent for modules and we need get url
of modules and count
of their submodules with 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();
准备好的 SQL 将是:
select `url`,
(select COUNT(*) from `submodules`
where `id` > ? and `modules`.`id` = `submodules`.`module_id`)
as `countOfSubModules`
from `modules`
或者您可以使用 原始 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();
原文由 Artem Molotov 发布,翻译遵循 CC BY-SA 3.0 许可协议
2 回答3.1k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
1 回答1.3k 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
1 回答1k 阅读✓ 已解决
1 回答1.3k 阅读✓ 已解决
2 回答973 阅读✓ 已解决
最简单的是使用 DB::raw