如何在Laravel数据库查询中使用派生列

问题描述 投票:1回答:2

我正在尝试在我的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();

我已经尝试过whereRaw和但是我一直在尝试同样的错误。

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)

任何帮助将不胜感激。

database laravel postgresql laravel-5
2个回答
1
投票

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

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

0
投票

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

相反,将计数添加到您的选择,然后使用value()获取计数,类似于:

 $query->selectRaw('count(*) as count, price - cost_price AS margin')
       ->havingRaw('margin < ?', [$settingValue])
       ->value('count');
© www.soinside.com 2019 - 2024. All rights reserved.