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

Posted

技术标签:

【中文标题】Laravel - 使用 Eloquent 查询构建器在选择中添加自定义列【英文标题】:Laravel - Add custom column in select with Eloquent query buider 【发布时间】:2015-01-24 10:57:13 【问题描述】:

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

在纯 SQL 中考虑这个查询:

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

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

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

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

【问题讨论】:

【参考方案1】:

我们可以在 \Illuminate\Database\Query\Builder::selectSub 方法的第一个参数作为 raw SQLClosure\Illuminate\Database\Query\Builder 的 select 中添加子查询或“自定义列”。更好的解决方案是closureBuilder。 在您的情况下,它将是:

$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();

【讨论】:

考虑解释一下你做了什么。 如果您谈论的是发帖日期,我深表歉意。我一下子没看到。我认为该解决方案可能有用。还是我搞错了? 我并不是说你的答案没有用。我只是说如果你解释你所做的事情会更有用。 我通过添加细节更改了描述,以后可能会重写。谢谢!对不起我的英语不好。 :) 非常好!我想我们都同意现在好多了。用户现在实际上可以从您的答案中学到一些东西。我会为你的努力投票赞成你的答案。继续加油,干得好! :) 和平【参考方案2】:

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

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

【讨论】:

拜托,无论如何不用 DB::raw() 用 eloquent 来做?【参考方案3】:

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

您可以指定要返回的列:

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

【讨论】:

我认为解决方案很接近,但是在尝试您的解决方案时出现此 SQL 错误:SQLSTATE[42S22]: Column not found: 1054 Unknown column '1' in 'field list' (SQL :从modules中选择1作为active 这将忽略['url'] 这不起作用。我得到与 ZarkDev 相同的错误。 Column not found: 1054 Unknown column '1' in 'field list'

以上是关于Laravel - 使用 Eloquent 查询构建器在选择中添加自定义列的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Eloquent 在 Laravel 中开始查询?

如何在 Laravel 5.8 中使用 Eloquent 进行查询?

如何使用 Laravel Eloquent 创建子查询?

Laravel Lumen - Eloquent 查询日志

Laravel,获得类似 Eloquent 使用查询生成器的结果

在 Laravel 中使用 Eloquent 进行更高级的数据库查询