如何在 Laravel DB 查询中使用派生列

Posted

技术标签:

【中文标题】如何在 Laravel DB 查询中使用派生列【英文标题】:How to use derived columns in Laravel DB query 【发布时间】:2019-02-22 13:48:30 【问题描述】:

我尝试在我的 Laravel 应用程序中设置查询时遇到了一些问题。 我正在尝试在数据库级别计算某些内容,然后通过 ajax 调用将其返回给用户。

这里是被调用函数的一部分:

$query = \DB::table('db_table');

    switch ($request['type']) 
        case 'type1':
            $settingValue = $request['type1'];
            $query = $query->selectRaw('price - cost_price AS margin');
            $query = $query->havingRaw('margin < ?', [$settingValue]);

            break;

        case 'type2':
            $settingValue = $request['type2'];
            $query = $this->addSelectQuery($query, '((price - cost_price) / price) AS profit');
            $query = $query->havingRaw('profit < ?', [$settingValue]);

            break;

        default: 
            return false;
    

    $filteredProducts = $query->where('id', '=', $id)->count();

我已经尝试过 where、whereRaw 和 have,但我一直收到同样的错误。

Illuminate\Database\QueryException:
SQLSTATE[42703]: Undefined column: 7 ERROR:  column "margin" does not exist
(SQL: select count(*) as aggregate from "db_table" where "id" = 21 having margin < 15)

任何帮助将不胜感激。

【问题讨论】:

在你的$query = $query-&gt;selectRaw('price - cost_price AS margin') 行中,这应该是sum(price - cost_price) AS margin吗? 不,这应该为每条记录计算,然后查询应该只检索边距低于客户在应用程序其他地方填写的数量的记录数量。 【参考方案1】:

您必须计算WHERE 子句中的值:

case 'type1':
    $settingValue = $request['type1'];
    $query->whereRaw('price - cost_price < ?', [$settingValue]);
    break;

【讨论】:

是的,这似乎成功了。感谢您的帮助。【参考方案2】:

问题是您使用的 count() 方法不会使用您的 selectRaw。

相反,将计数添加到您的选择中,然后使用 value() 获取计数,例如:

 $query->selectRaw('count(*) as count, price - cost_price AS margin')
       ->havingRaw('margin < ?', [$settingValue])
       ->value('count');

【讨论】:

以上是关于如何在 Laravel DB 查询中使用派生列的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在laravel的json数组列中找到字符串搜索的位置

如何在 Laravel 的 DB 查询中编写两个 where 条件?

如何在 DB::select(query) 上使用分页 - Laravel

如何在 Laravel 中获取当前查询 DB_HOST 值

如何使用 laravel 查询生成器从表联合的结果中选择列?