【问题标题】:Multiple sum on one query in Eloquent在 Eloquent 中对一个查询进行多次求和
【发布时间】:2017-01-03 16:56:27
【问题描述】:

我正在尝试加速我的应用程序,但有一个关于对单个 Eloquent 查询执行操作的问题。

我需要绘制一个包含不同总数的表格。

        $records = $this->finance
                        ->where('company_id','=',$this->company_id)
                        ->where(DB::raw('MONTH(date)'), '=', $month['month'])
                        ->where(DB::raw('YEAR(date)'), '=', $year)
                        ->where('financeaccounts_id', '=', $account);

        $income = $records->where('type','=','Income')->sum('amount');
        $expense = $records->where('type','=','Expense')->sum('amount');
        $correction = $records->where('type','=','Correction')->sum('amount');  

“收入”计算正确,但随后的“总和”计算不正确。我猜查询正在随着每个分配而被修改。我会很感激你的帮助。 谢谢

【问题讨论】:

    标签: mysql laravel eloquent


    【解决方案1】:

    我认为更好的方法是只运行一个查询而不是 3 个,然后使用集合:

    $records = $this->finance
        ->where('company_id','=',$this->company_id)
        ->where(DB::raw('MONTH(date)'), '=', $month['month'])
        ->where(DB::raw('YEAR(date)'), '=', $year)
        ->where('financeaccounts_id', '=', $account)
        ->get();
    
        $income = $records->where('type', 'Income')->sum('amount');
        $expense = $records->where('type', 'Expense')->sum('amount');
        $correction = $records->where('type', 'Correction')->sum('amount');
    

    在此代码中,您使用的是 sum() 集合方法,而不是查询构建器的 sum() 方法。这种方法不会创建三个查询,而只会创建一个。

    【讨论】:

    • 谢谢 Alexey,太好了
    • @Alexey Mezenin 你能帮我写这篇文章吗? https://stackoverflow.com/q/51226415/1830228 谢谢
    【解决方案2】:

    您也可以使用子查询在一个查询中完成所有操作:

    $records = $this->finance
                        ->select('finances.*')
                        ->selectSub(function($query) {
                            return $query->selectRaw('SUM(amount)')
                                ->where('type', '=', 'Income');
                        }, 'income_sum')
                        ->selectSub(function($query) {
                            return $query->selectRaw('SUM(amount)')
                                ->where('type', '=', 'Expense');
                        }, 'expense_sum')
                        ->selectSub(function($query) {
                            return $query->selectRaw('SUM(amount)')
                                ->where('type', '=', 'Correction');
                        }, 'correction_sum')
                        ->where('company_id','=',$this->company_id)
                        ->whereMonth('date' $month['month'])
                        ->whereYear('date' $year)
                        ->where('financeaccounts_id', '=', $account)
                        ->get();                  
    
    $income = $records->income_sum;
    $expense = $records->expense_sum;
    $correction = $records->correction_sum;
    

    【讨论】:

      【解决方案3】:

      是的,你是对的,查询被修改了。要解决此问题,您可以将查询克隆为:

      $income_records = clone $records;
      $expense_records = clone $records;
      $correction_records = clone $records;
      
      $income = $income_records->where('type','=','Income')->sum('amount');
      $expense = $expense_records->where('type','=','Expense')->sum('amount');
      $correction = $correction_records->where('type','=','Correction')->sum('amount');
      

      【讨论】:

      • 谢谢阿米特,感谢
      猜你喜欢
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-08
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多