Laravel 带 where 子句的查询生成器 SUM

Laravel Query Builder SUM with where clause

我有以下关系:项目有很多记录(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]: Column not found: 1054 Unknown column 'quantity_sum' in 'where clause' (SQL: select items.*, (select sum(quantity) as total from records where item_id = items.id group by item_id) as quantity_sum from items where quantity_sum = 1)

为什么我不能使用 quantity_sum 别名?
如何仅筛选 Records.quantity 列中总和小于 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();

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

在项目模型中:

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