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 byitem_id
) asquantity_sum
fromitems
wherequantity_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:调用未定义的方法 Illuminate\\Database\\Query\\Builder
laravel 5.2 调用未定义的方法 Illuminate\Database\Query\Builder::associate()
“使用 Laravel 调用未定义的方法 Illuminate\\Database\\Query\\Builder::users() [关闭]