2017-01-03 3 views
1

Ich versuche, meine Anwendung zu beschleunigen und habe eine Frage über die Durchführung von Aktionen auf einer einzigen Eloquent-Abfrage.Mehrere Summe auf eine Abfrage in Eloquent

Ich muss eine Tabelle mit verschiedenen Summen zeichnen.

 $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'); 

'Einkommen' wird korrekt berechnet, die nachfolgenden 'Summen' jedoch nicht. Ich vermute, dass die Abfrage mit jeder Zuweisung geändert wird. Ich würde deine Hilfe schätzen. Danke

Antwort

0

Ja, Sie haben Recht, dass Abfrage geändert wird. Um dieses Problem zu lösen, können Sie die Abfrage klonen wie:

$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'); 
+0

Dank Amit, apprciated – user3459394

0

ich besserer Weg, nur eine Abfrage anstelle von 3 würde laufen und dann mit der Sammlung arbeiten:

$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'); 

In diesem Code du bist Verwenden von sum() Sammlungsmethode anstelle der sum() Methode des Abfragegenerators. Dieser Ansatz erstellt keine drei Abfragen, sondern nur eine.

+0

Dank Alexey, das ist großartig – user3459394

0

Sie auch Subqueries sie alle in einer Abfrage zu tun verwenden:

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