首页 > 解决方案 > 在 laravel 的查询中查询相关记录并从中进行一些计算

问题描述

我在我的开发中使用 laravel,我有一个看起来像这样的数据库。

卖家表:

ID 姓名 位置
1 约翰 导师
2 迈克尔 导师
3 已经 区域经理
4 门兹 经理
5 文员

卖家销售表:

ID 卖家ID 销售量
1 1 一月 5000
2 1 二月 10000
3 2 一月 1000
4 2 二月 1000
5 3 二月 1000

在我的代码中,我想要完成的是按位置对卖家表进行分组。另外,我还需要统计有多少卖家从之前的销售中达到了 1000。在此示例中,示例输出如下所示。

结果:

位置 总数 已从上一次销售达到 1000 次销售 与之前的销售相比,尚未达到 1000 次销售
导师 2 1 1
区域经理 1 0 1
经理 1 0 1
文员 1 0 1

我的问题是,是否可以单独使用查询来实现这一点?或者我真的需要为此添加额外的逻辑?目前,数据库已经使用一对多关系连接。我的示例查询如下所示

      $seller = Seller::with(['sales' => function ($query)use ($dateForCondition){
                                $query->orderBy('date', 'desc')
                               ->where('date', '<=', $dateForCondition)
                               ->limit(2);
                             }])

如果可以单独使用查询,你能给我一些想法吗?如果单独使用查询是不可能的,我需要手动循环所有记录并添加一些条件和变量来按位置分组,我有数千条记录,我担心在这个过程中我可能会遇到一些限制。请帮忙谢谢。

标签: mysqlsqllaraveleloquentgroup-by

解决方案


似乎您几乎拥有在刀片中完成工作所需的所有数据,

$salesPeopleGrouped = Seller::with(['sales' => function ($query) use ($dateForCondition) {
    $query->orderBy('date', 'desc')
        ->where('date', '<=', $dateForCondition)
        ->limit(2); // Not sure why you are setting a limmit.
}])->groupBy('position');


<table class="s-table">
    <thead>
        <tr>
            <th style="text-align: left;">position</th>
            <th style="text-align: center;">total count</th>
            <th style="text-align: right;">has Reach 1000 sales from previous sale</th>
            <th style="text-align: right;">has not Reach 1000 sales from previous sale</th>
        </tr>
    </thead>
    <tbody>
    @foreach($salesPeopleGrouped as $position => $salesPeople)
    @php
        $over = $salesPeople->countBy(function ($person) {
            return $person->sales >= 1000;
        });
    @endphp
    <tr>
        <td style="text-align: left;">{{ $position }}</td>
        <td style="text-align: center;">{{ $salesPeople->count() }}</td>
        <td style="text-align: right;">{{ $over }}</td>
        <td style="text-align: right;">{{ $salesPeople->count() - $over }}</td>
    </tr>
    @endforeach
    </tbody>
</table>

推荐阅读