Heim > PHP-Framework > Laravel > Abfragezeiten der Laravel-Assoziation

Abfragezeiten der Laravel-Assoziation

王林
Freigeben: 2023-05-29 10:03:37
Original
559 Leute haben es durchsucht

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.

  1. Lazy Loading

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;
Nach dem Login kopieren
Nach dem Login kopieren

}

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;
Nach dem Login kopieren
Nach dem Login kopieren

}

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.

  1. Eager Loading

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;
}
Nach dem Login kopieren

}

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.

  1. select deklariert verwandte Felder

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');
Nach dem Login kopieren

}])->get();

foreach ($users as $user ) {

echo $user->profile->name; // 只会查询'profile'表中的'user_id'和'name'列
Nach dem Login kopieren

}

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.

  1. Verwenden Sie Join für zugehörige Abfragen

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();
Nach dem Login kopieren

foreach ($users as $user) {

echo $user->name;
echo $user->age;
echo $user->title;
Nach dem Login kopieren

}

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage