Heim > Artikel > PHP-Framework > Abfragezeiten der Laravel-Assoziation
Laravel ist ein sehr beliebtes PHP-Framework mit umfangreichen Funktionen und einer benutzerfreundlichen API. Unter ihnen ist Eloquent ORM eine seiner leistungsstärksten Datenbankkomponenten, mit der sich einfache Abfragen und Korrelationen durchführen lassen.
Wenn wir jedoch komplexe Korrelationsabfragen durchführen, werden wir feststellen, dass die Anzahl der Abfragen sehr hoch wird, insbesondere wenn Schleifen verwendet werden. Dies wirkt sich nicht nur auf die Abfrageleistung aus, sondern kann auch Ausnahmen bei der Datenbankverbindung verursachen.
Wie können wir also die Anzahl verwandter Abfragen in Laravel reduzieren? Im Folgenden finden Sie in diesem Artikel einige Lösungen.
Bei der Durchführung verwandter Abfragen können wir die Lazy-Loading-Funktion von Laravel verwenden, die nur dann abfragt, wenn das zugehörige Modell verwendet werden muss.
Lazy Loading verwendet die magische Methode __get(). Solange sie also für das zugehörige Modell aufgerufen wird, wird die zugehörige Abfrage ausgelöst.
Zum Beispiel:
$users = User::all();
foreach ($users as $user) {
echo $user->profile->name;
}
Wenn wir $users->profile direkt in der foreach-Schleife verwenden, dann In jeder Schleife wird eine verwandte Abfrage ausgeführt, was zu einer großen Anzahl von Abfragen führt, sodass wir sie durch verzögertes Laden optimieren können.
$users = User::with('profile')->get();
foreach ($users as $user) {
echo $user->profile->name;
}
Bei Verwendung der with()-Methode zum Vorladen des zugehörigen Modells , verzögertes Laden wird automatisch aktiviert und Abfragen werden nur durchgeführt, wenn Sie das zugehörige Modell verwenden müssen.
Solange wir Lazy Loading manuell aufrufen und keine umfassende Überprüfung des Codes durchführen, treten immer noch wiederholte Abfragen auf. Eine gründlichere Lösung besteht daher darin, Eager Loading (Vorladen) zu verwenden Alle benötigten zugehörigen Modelle können auf einmal geladen werden.
Zum Beispiel:
$users = User::with('profile', 'posts')->get();
foreach ($users as $user) {
echo $user->profile->name; foreach ($user->posts as $post) { echo $post->title; }
}
Use with( ) Wenn mehrere verwandte Modelle gleichzeitig geladen werden, werden mehrere SQL-Abfragen ausgeführt. Wenn wir nur eines der verwandten Modelle verwenden müssen, ist diese Methode nicht die beste Wahl.
In Eloquent können wir die Methode select verwenden, um ein Modell zu filtern und die spezifischen Spalten anzugeben, die wir benötigen. Das Gleiche gilt für verwandte Modelle.
Zum Beispiel:
$users = User::with(['profile' => function ($query) {
$query->select('user_id', 'name');
}])->get();
foreach ($users as $user ) {
echo $user->profile->name; // 只会查询'profile'表中的'user_id'和'name'列
}
In diesem Beispiel können Sie durch Angabe der Methode select() zur Ausgabe der benötigten Spalten zulassen, dass Eloquent ORM jeweils nur einige bestimmte Datenspalten abfragt. Dies ist eine gute Möglichkeit, bestimmte Datenspalten schnell abzufragen Daten und stellt auch bereit. Mit diesem Ansatz reduzieren wir die Anzahl zusätzlicher Abfragen, sodass wir Abfragen auf verwandte Modelle beschränken können.
Zusätzlich zum Umgang mit zugehörigen Modellen können Join-Abfragen in bestimmten Fällen effizienter sein als die zugehörigen Abfragen von Eloquent.
Zum Beispiel:
$users = DB::table('users')
->join('profiles', 'users.id', '=', 'profiles.user_id') ->join('posts', 'users.id', '=', 'posts.user_id') ->select('users.name', 'profiles.age', 'posts.title') ->get();
foreach ($users as $user) {
echo $user->name; echo $user->age; echo $user->title;
}
Obwohl Join-Abfragen die Komplexität und Wartbarkeit von SQL-Anweisungen erhöhen, aber Im Vergleich zu Eloquent ORM kann die Join-Abfrage die Abfrageleistung besser optimieren.
Zusammenfassung
Die oben genannten Methoden sind effektive Techniken, mit denen wir die Anzahl verwandter Abfragen in Laravel reduzieren können. Im Allgemeinen können wir Preloading und Lazy Loading verwenden, um die Abfrageleistung zu optimieren und wiederholte Abfragen zu vermeiden. Bei einigen spezifischen und komplexen Abfragen können wir die Verwendung von Join-Abfragen in Betracht ziehen, um effizientere Ergebnisse zu erhalten.
Abschließend ist die Optimierung von Abfragen immer wichtig, egal welchen Ansatz wir wählen. Sie kann die Leistung unserer Anwendung erheblich verbessern und unsere Antwortzeit verkürzen.
Das obige ist der detaillierte Inhalt vonAbfragezeiten der Laravel-Assoziation. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!