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
我有以下关系:项目有很多记录(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 fromrecords
whereitem_id
=items
.id
group byitem_id
) asquantity_sum
fromitems
wherequantity_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