Eloquent 技巧分享:使用布尔值来作为 Group By Raw 条件
我知道标题听起来不是很清楚,所以让我从一个例子开始。如果你数据库中有birth_date 字段,并且想显示你有多少名成人年龄在18岁以上,并有几名儿童,你的Eloquent查询怎么构建?让我们来看看。
第一步. 简单的 groupBy
首先,让我提醒你一个典型的groupBy用法。例如,你需要按照城市对用户进行分组:
$results = User::select('city', \DB::raw('COUNT(id) as amount'))
->groupBy('city')
->get();
foreach ($results as $result) {
echo $result->city . ': ' . $result->amount . '<br />';
}
第二步. 通过 Raw 构造条件进行groupBy
接下来,如果你想要通过 year 字段分组,看起来就像下面这样:
$results = User::select(\DB::raw('YEAR(birth_date) as year, COUNT(id) as amount'))
->groupBy(\DB::raw('YEAR(birth_date)'))
->get();
因此,我们对所有的select语句使用 DB::raw() 构建表达式,并在groupBy() 中重复同样的条件。以下是用生成的假数据得到的效果图。
步骤3.带有布尔条件的 groupBy Raw
现在,是时候展示一些技巧了。如何根据「 2001年之前和2001年之后出生」 的条件进行分组?这是代码:
$results = User::select(\DB::raw('YEAR(birth_date) < 2001 as adult, COUNT(id) as amount'))
->groupBy(\DB::raw('YEAR(birth_date) < 2001'))
->get();
看起来很奇怪,对吧?让我解释一下。条件年份(出生日期)<2001将返回两个值之一 真或假。换句话说,1或0。这正是我们需要分组的地方——不管这个人是不是成年人。这是 Blade 中的结果视图:
<table class="table">
<thead>
<tr>
<th>Adult?</th>
<th>Amount</th>
</tr>
</thead>
<tbody>
@foreach ($results as $result)
<tr>
<td>{{ $result->adult == 1 ? 'Yes' : 'No' }}</td>
<td>{{ $result->amount }}</td>
</tr>
@endforeach
</tbody>
</table>
这是页面的效果:
只要能明确 TRUE/FALSE 条件,比如某个地方的奇数/偶数、某个数字在上方/下方等,就可以使用这样的分组。
阅读有关原始查询的详细信息(在官方文档中) here in the official documentation.
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
YEAR(birth_date) < 2001 还可以这样