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将返回两个值之一 。换句话说,10。这正是我们需要分组的地方——不管这个人是不是成年人。这是 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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://laraveldaily.com/eloquent-trick-...

译文地址:https://learnku.com/laravel/t/39537

本文为协同翻译文章,如您发现瑕疵请点击「改进」按钮提交优化建议
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

YEAR(birth_date) < 2001 还可以这样

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!