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

新手上路,请多包涵

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

在纯 SQL 中考虑此查询:

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

如何使用查询生成器添加常量活动列?

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

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

原文由 YannPl 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 559
2 个回答

最简单的是使用 DB::raw

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

原文由 turntwo 发布,翻译遵循 CC BY-SA 3.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 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏