Laravel Query Builder SUM 与 where 子句

Posted

技术标签:

【中文标题】Laravel Query Builder SUM 与 where 子句【英文标题】:Laravel Query Builder SUM with where clause 【发布时间】:2020-07-26 06:50:09 【问题描述】:

我有如下关系:Items有很多Records(Records.item_id引用Items.id)

我的这个查询工作正常:

$items = Item::addSelect(['quantity_sum' => Record::selectRaw('sum(quantity) as total')
                                ->whereColumn('item_id', 'items.id')
                                ->groupBy('item_id')
                             ])
                    ->get();

但我只需要获取 records.quantity 的总和低于 1 的项目。我尝试添加 ->where('quantity_sum', '1') 但我明白了错误信息:

SQLSTATE[42S22]:找不到列:1054 'where 子句'中的未知列'quantity_sum'(SQL:选择items.*,(从records 中选择总和(数量),其中item_id = items.id group by item_id) as quantity_sum from items where quantity_sum = 1)

为什么我不能使用 quantity_sum 别名? 如何仅过滤 Records.quantity 列中总和小于 1 的项目?

【问题讨论】:

【参考方案1】:

你应该使用HAVING

类似的东西:

->havingRaw('sum(quantity) > ?', [1])

编辑:

$items = Item::addSelect(['quantity_sum' => Record::selectRaw('sum(quantity) as total')->whereColumn('item_id', 'items.id')->groupBy('item_id')])
    ->havingRaw('quantity_sum < ?', [1])
    ->groupBy('items.id') 
    ->get();

【讨论】:

这个技巧很好!我是通过这种方式得到的: ->haveRaw('quantity_sum groupBy('items.id') 您可以编辑您的答案以对应最终代码吗? $items = Item::addSelect(['quantity_sum' => Record::selectRaw('sum(quantity) as total') ->whereColumn('item_id', 'items.id') ->groupBy('item_id') ]) ->haveRaw('quantity_sum groupBy('items.id') ->get();【参考方案2】:

您应该像这样定义项目和记录模型之间的关系:

在项目模型中:

public function records()

return $this->hasMany(Record::class,'item_id');

在记录模型中:

public function item()

return $this->belongsTo(Item::class,'item_id');

只需在您的查询中使用 'doesntHave',如下所示:

$itemsWithoutRecords= Item::doesntHave('records')->get();

如果你喜欢 'count' 方式,你可以使用 'withCount' 之类的:

$itemsWithoutRecords= Item::withCount('records')->having('records_count','<',1)-> get();

注意:两种方式都需要模型之间的正确关系

第一种方式:https://laravel.com/docs/7.x/eloquent-relationships#querying-relationship-absence

第二种方式:https://laravel.com/docs/7.x/eloquent-relationships#counting-related-models

【讨论】:

关系是正确的。计数不是这里的重点。我想根据嵌套表的一列的总和进行过滤。第一个 sum(records.quantity) 作为quantity_sum,然后将quantity_sum 为什么要从 db 中获取所有结果然后进行过滤,您不应该在查询中进行过滤吗?如果你想要这个,你可以使用: $items= Item::withCount('records')-> get()->where('records_count','

以上是关于Laravel Query Builder SUM 与 where 子句的主要内容,如果未能解决你的问题,请参考以下文章

Laravel中的Query Builder

Laravel中的Query Builder

Laravel:调用未定义的方法 Illuminate\\Database\\Query\\Builder

laravel 5.2 调用未定义的方法 Illuminate\Database\Query\Builder::associate()

“使用 Laravel 调用未定义的方法 Illuminate\\Database\\Query\\Builder::users() [关闭]

Laravel:在“query-builder”或“eloquent”中更改原始查询