可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have the following query:
Item::select(['items.id', 'inventory.quantity']) ->leftJoin('inventory', 'items.id', '=', 'inventory.item_id') ->groupBy('items.id') ->count();
The count()
method always returns 1 despite there being 20 rows to the results that are returned. Why might this be?
Here is the raw query from DB::getQueryLog()
:
select count(*) as aggregate from `items` left join `inventory` ON `items`.`id` = `inventory`.`item_id` group by `items`.`id`
回答1:
Yes, count
returns only 1 row, always.
You would probably want:
Item::select(['items.id as id', 'inventory.quantity as quantity']) ->leftJoin('inventory', 'items.id', '=', 'inventory.item_id') ->groupBy('items.id') ->lists('quantity', 'id');
this will return an array with id
as keys, and quantity
as values. Otherwise use get
, but never count
if you want grouped results.
回答2:
If you only need the correct number of rows from a grouped result, and you don't care that much about the performance then you can call get()
first and then call count()
on that.
$count = Item::select(['items.id', 'inventory.quantity']) ->leftJoin('inventory', 'items.id', '=', 'inventory.item_id') ->groupBy('items.id') ->get() ->count();