【问题标题】:Query related record and do some calculation from it inside query in laravel在 laravel 的查询中查询相关记录并从中进行一些计算
【发布时间】:2021-04-21 03:07:05
【问题描述】:

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

卖家表:

id name position
1 john supervisor
2 michael supervisor
3 ved area manager
4 menz manager
5 jun clerk

卖家销售表:

id seller_id month Sales
1 1 january 5000
2 1 february 10000
3 2 january 1000
4 2 february 1000
5 3 february 1000

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

结果:

position total count has Reach 1000 sales from previous sale has not Reach 1000 sales from previous sale
supervisor 2 1 1
area manager 1 0 1
manager 1 0 1
clerk 1 0 1

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

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

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

【问题讨论】:

    标签: mysql sql laravel eloquent group-by


    【解决方案1】:

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

    $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>
    

    【讨论】:

    • 非常感谢你,伙计。我非常感谢这个答案。但是,我认为有些部分我没有在我的问题中清楚地解释。我想要的是减去当前月份和上个月,以检查我是否从上个月达到 1000 销售额。这也是我在子查询中限制 2 的原因。
    • 啊,不用担心,存储在数据库中的月份是纯 ol 字符串还是实际日期字段。 @希望
    • 实际上在我的真实数据中,它是一个日期类型,我给出的数据只是一个示例数据。
    • 此外,由于我们同时使用 'with' 和 'group by',因此您的回答会出错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多