Eloquent count() always returns 1

2020-04-17 08:26发布

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`

2条回答
The star\"
2楼-- · 2020-04-17 08:57

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.

查看更多
Emotional °昔
3楼-- · 2020-04-17 09:02

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();
查看更多
登录 后发表回答