Laravel - 使用Eloquent查询构建器在select中添加自定义列

时间:2014-11-26 07:42:22

标签: php sql laravel eloquent

这是一个简化的用例,仅用于说明我想要实现的目标:

在纯SQL中考虑此查询:

SELECT url, 1 AS active
FROM  `modules` 
WHERE 1 

如何使用查询构建器添加常量活动列?

这是我的查询生成器,没有额外的列:

DB::table('modules')
->get(['url']);

3 个答案:

答案 0 :(得分:18)

最简单的方法是使用DB :: raw

     DB::table('modules')->get(['url', DB::raw('1 as active')]);

答案 1 :(得分:7)

我们可以使用\Illuminate\Database\Query\Builder::selectSub方法的第一个参数raw SQLClosure\Illuminate\Database\Query\Builder在select中添加子查询或“自定义列”。更好的解决方案是关闭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雄辩,我们需要获取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();

准备好的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();

答案 2 :(得分:-1)

Laravel Eloquent拥有非常灵活的查询构建器。

您可以指定要返回的列:

$users = DB::table('modules')->select('1 as active')->get(['url']);