【问题标题】:How to sum a colum from a related model efficiently on Laravel如何在 Laravel 上有效地对相关模型中的列求和
【发布时间】:2021-07-15 08:44:33
【问题描述】:

好的,我得到了这张桌子

affiliates_referral_clicks
id | affiliate_id | clicks | date
1  | 1            | 10     | 2021-07-14
2  | 1            | 2      | 2021-07-11
3  | 2            | 1      | 2021-07-11
4  | 2            | 14     | 2021-07-10
...

当然,我的模特联盟与推荐点击有关系

附属.php

public function referralClicks(){
        return $this->hasMany(AffiliateReferralClick::class,'affiliate_id');
    }

现在我想为所有关联公司提供所有点击次数的总和,这些点击次数的日期在给定日期之间。我是这样实现的

$affiliate = Affiliate::with(['referralClicks' => function($query) use($params) { 
                $query->whereDate('date','>=', $params['dateFrom'])
                    ->whereDate('date','<=', $params['dateTo']) 
                    ->select('clicks')   
                ;
            }])->get();

foreach ($affiliates as $affiliate){
       $affiliate->totalClicks = $affiliate->referralClicks->sum('clicks');
}

这很好用,但由于affiliates_referral_clicks 表太大,请求最终太慢,我认为如果您在不使用 Eloquent 的帮助器的情况下进行查询,您可以获得更快的查询。

所以我的问题是......我怎样才能做同样的事情,但使用原始查询(或任何最有效的方式)?我正在使用 MySQL DB,希望你们能帮助我!

【问题讨论】:

    标签: php mysql laravel eloquent query-optimization


    【解决方案1】:

    还没有尝试过,但这就是我解决这个问题的方法(如果我们假设,你只需要总和而不需要关系中的其他任何东西):

    $affiliate = Affiliate::withSum(['referralClicks.clicks as totalClicks' => function($query) use($params) { 
        $query->whereDate('date','>=', $params['dateFrom'])
              ->whereDate('date','<=', $params['dateTo']) 
              ->select('clicks')   
        ;
    }])->get();
    

    【讨论】:

    • 很遗憾我使用的是旧版本的 Eloquent,所以我无法使用 withSum 方法
    • 太糟糕了。您介意在您的问题中添加版本标签,以便其他人知道他们正在处理的 Laravel 版本吗?
    • @shaedrich 不要删除这个答案,它可能会帮助一些人
    • @JohnLobo 哦,当然。谢谢你的提示。
    • @AnibalCardozo 您可以在旧版本中使用带有闭包的withCount 方法。即:-&gt;withCount(['referralClicks as totalClicks' =&gt; function($query) { $query-&gt;select(DB::raw('sum(clicks)'))-&gt;whereDate(...); }]).
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-03
    • 2021-09-18
    • 2015-08-10
    • 1970-01-01
    相关资源
    最近更新 更多