2017-05-15 1 views
1

Ich habe eine Million DatenWas ist der Effekt, wenn die Summe nicht get() verwendet? Laravel 5.3

Wenn ich sum Verwendung get() wie folgt aus:

$cache = Summary::where('type', $type) 
       ->where('keys->year', '=', (string)$year) 
       ->get(); 
$summary = $cache->sum('summary'); 

Es ist sehr langsam

Aber wenn ich sum ohne Verwendung get() wie folgt aus:

$cache = Summary::where('type', $type) 
       ->where('keys->year', '=', (string)$year); 
$summary = $cache->sum('summary'); 

Es ist sehr schnell

Ob es in Ordnung ist, wenn die sum ohne get?

+0

Ohne get() wird Ihre Anweisung nicht ausgeführt. –

+1

@Friedrich Roell, ich habe 'sum' ohne' Get', es ist ausgeführt –

Antwort

2

Wenn Sie -> get() verwenden, rufen Sie tatsächlich die Informationen aus der Datenbank ab. Wenn Sie viele Zeilen haben, kann dies eine Abfrage sehr verlangsamen.

Das -> sum() addiert nur die Zeilen, eine Methode, die im Vergleich zu -> get() leicht ist.

Wenn Sie die Informationen aus den Zeilen nicht benötigen, sondern nur die Summe aller Zeilen, sollten Sie nur -> sum() und nicht -> get() verwenden. Sie müssen nicht -> get() verwenden, um die Funktion -> sum() zu verwenden.

Laravel Documentation enthält die folgenden Beispiele:

$users = DB::table('users')->count(); 
$price = DB::table('orders')->max('price'); 

Beide nicht nutzen -> get(), um -> count() oder -> max().

Ich denke, man könnte sogar tun:

$sum = Summary::where('type', $type)->where('keys->year', '=', (string)$year)->sum(); 
+0

Ob das bedeutet, die Schlussfolgerung ist, dass es getan werden kann? Kein Effekt? –

+0

Wenn Sie nur die Zeilen summieren wollen, die nicht verwendet werden -> get() hat in diesem Fall keine Wirkung nein. –

1

get() verwenden holt alle Daten und dann sind Sie manuell die Summe auf der Sammlung von abgerufenen Daten zu finden. Aber wenn Sie nicht verwenden get() $cache ist immer noch eine Abfrage und Abrufsumme für die Abfrage würde eine Gesamtabfrage auf der Datenbank statt alle Daten abrufen.

$summary = Summary::where('type', $type) 
    ->where('keys->year', '=', (string)$year) 
    ->sum('summary'); 
+0

Ob das bedeutet, die Schlussfolgerung ist, dass es getan werden kann? Kein Effekt. Zum Beispiel Fehler –

+0

@samueltoh die Schlussfolgerung ist, dass dies der richtige Weg ist, es zu tun, ohne get() zu verwenden. Es gibt keine Fehler oder Probleme, es ist der richtige Weg. – Sandeesh