返回
如何用一个查询从同一张表中获取多个计数,同时使用多个条件?
php
2024-05-27 07:45:12
用 Eloquent 查询从多个列中获取多个计数,同时使用多个条件
问题
当你需要从同一张表中统计多个值时,重复每个查询并仅修改 where()
子句是一种常见的方法。虽然这可以工作,但它并不是一个 DRY(不要重复自己)的方法。
解决方案
为了采用更 DRY 的方法,我们可以使用 Eloquent 的 whereIn
和 groupBy
方法。通过使用这些方法,我们可以使用单个查询来获取所有所需的计数。
示例代码
$counts = DB::table('stores')
->select(DB::raw('store_id, country, count(*) as count'))
->whereIn('store_id', ['1', '2', '3'])
->orWhere('country', 'Netherlands')
->orWhere('country', 'Sweden')
->groupBy('store_id', 'country')
->get();
视图中的使用
在视图中,我们可以遍历 $counts
集合来获取所需的值:
@foreach ($counts as $count)
{{ $count->store_id }}, {{ $count->country }}, {{ $count->count }}
@endforeach
好处
这种方法提供了几个好处:
- DRY: 不再需要重复查询。
- 高效: 单一查询比多个查询更有效。
- 灵活性:
whereIn
和groupBy
方法允许你轻松添加或删除计数条件。
结论
通过使用 Eloquent 的 whereIn
和 groupBy
方法,你可以用一个查询从同一张表中获取多个计数,同时使用多个条件。这是一种更 DRY、高效和灵活的方法。
常见问题解答
-
我可以使用
whereBetween
或whereDate
之类的其他条件吗?
答:是的,你可以使用任何有效的 Eloquent 条件。 -
如果我想获取其他列(如
SUM
或AVG
)怎么办?
答:可以使用select
方法添加其他列,例如:->select(DB::raw('store_id, country, count(*) as count, sum(amount) as total_amount'))
-
如果我有一个多对多关系,我怎样才能获取计数?
答:对于多对多关系,你需要使用withCount()
方法,例如:$stores->withCount('products');
-
我可以使用该方法对嵌套查询进行分组吗?
答:是的,你可以使用嵌套查询和groupByRaw
方法。 -
该方法是否适用于所有数据库后端?
答:不一定,不同的数据库后端可能支持不同类型的分组和聚合函数。建议查阅特定数据库的文档以了解其功能。