2016-04-04 3 views
1

Ich benutze dies zuvor, um die MAX-RecordID aus redegewandten Modell zu erhalten. Wenn die Datenbanktabellenzeile mehr als 20k ist, wird leider 500 interner Serverfehler zurückgegeben.Laravel Eloquent Aggregate (Max) zurück 500 Server Fehler

Ich habe laravel.log und auch Apache Fehlerprotokoll überprüft, konnte aber keine Ahnung bekommen ..

Danach versuche ich, „XXX“ zu Echo; Ausfahrt(); vor jeder Zeile meines Codes und festgestellt, dass die exit() stoppen nach dieser Zeile ausgeführt werden.

$lastRecord_sync = \App\TableModel::all()->max('record_id'); 

Dann habe ich versucht, nach unten zu ändern und es funktioniert einfach gut.

$lastRecord_sync = DB::table('tms_door_record_raw')->max('record_id'); 

Darf ich wissen, was eigentlich das Problem hier ist? Unterscheidet sich SQL von Eloquent Model und DB Query Builder?

+1

Die erste Zeile ruft alle Datensätze in Ihrer Anwendung ab und wendet dann die max. Das ist ineffizient (wie Sie bereits bemerkt haben) –

+0

Ist php nicht nach 30 Sekunden Zeit? – Stuart

Antwort

1

Dieser Code:

$lastRecord_sync = \App\TableModel::all()->max('record_id'); 

Laravel Sagt alle Datensätze in der Tabelle als eine Sammlung abzurufen, dann bekommen die max record_id in dieser Sammlung (siehe: Collections: max), vermutlich um über die gesamte Kollektion Looping die kann sehr langsam sein, wenn Sie viele Datensätze haben.

Der zweite Code-Schnipsel:

$lastRecord_sync = DB::table('tms_door_record_raw')->max('record_id'); 

Laravel Sagen zu essentally diese Abfrage ausführen (siehe: Query Builder: Aggregates):

SELECT MAX('record_id') FROM table; 

MySQL ist viel effizienter bei dem max Rekord als PHP zu finden ist looping durch jeden Datensatz in der Sammlung und Suche nach dem Maximum record_id dort.