返回

如何用一个查询从同一张表中获取多个计数,同时使用多个条件?

php

用 Eloquent 查询从多个列中获取多个计数,同时使用多个条件

问题

当你需要从同一张表中统计多个值时,重复每个查询并仅修改 where() 子句是一种常见的方法。虽然这可以工作,但它并不是一个 DRY(不要重复自己)的方法。

解决方案

为了采用更 DRY 的方法,我们可以使用 Eloquent 的 whereIngroupBy 方法。通过使用这些方法,我们可以使用单个查询来获取所有所需的计数。

示例代码

$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: 不再需要重复查询。
  • 高效: 单一查询比多个查询更有效。
  • 灵活性: whereIngroupBy 方法允许你轻松添加或删除计数条件。

结论

通过使用 Eloquent 的 whereIngroupBy 方法,你可以用一个查询从同一张表中获取多个计数,同时使用多个条件。这是一种更 DRY、高效和灵活的方法。

常见问题解答

  1. 我可以使用 whereBetweenwhereDate 之类的其他条件吗?
    答:是的,你可以使用任何有效的 Eloquent 条件。

  2. 如果我想获取其他列(如 SUMAVG)怎么办?
    答:可以使用 select 方法添加其他列,例如:

    ->select(DB::raw('store_id, country, count(*) as count, sum(amount) as total_amount'))
    
  3. 如果我有一个多对多关系,我怎样才能获取计数?
    答:对于多对多关系,你需要使用 withCount() 方法,例如:

    $stores->withCount('products');
    
  4. 我可以使用该方法对嵌套查询进行分组吗?
    答:是的,你可以使用嵌套查询和 groupByRaw 方法。

  5. 该方法是否适用于所有数据库后端?
    答:不一定,不同的数据库后端可能支持不同类型的分组和聚合函数。建议查阅特定数据库的文档以了解其功能。