𝗦𝘁𝗼𝗽 𝗡+𝟭 𝗔𝘃𝗮𝗹𝗮𝗻𝗰𝗵𝗲𝘀: 𝗘𝗻𝗳𝗼𝗿𝗰𝗲 𝗟𝗮𝗿𝗮𝘃𝗲𝗹 𝗦𝘁𝗿𝗶𝗰𝘁 𝗠𝗼𝗱𝗲
Das N+1-Query-Problem ruiniert die Datenbankperformance. Es tritt auf, wenn Sie eine Liste von Datensätzen abrufen und diese durchlaufen, um auf eine Beziehung zuzugreifen, ohne diese Beziehung vorab geladen zu haben.
Angenommen, Sie zeigen 50 Rechnungen auf einem Dashboard an. Sie durchlaufen diese, um den Kundennamen anzuzeigen. Dabei haben Sie vergessen, die with-Methode zu verwenden. Eloquent führt eine Abfrage für die Rechnungen aus. Danach führt es 50 separate Abfragen für jeden einzelnen Kunden aus.
In der lokalen Entwicklung dauern 51 Abfragen etwa 10 Millisekunden. Das fällt nicht auf. In der Produktion verwandelt hoher Traffic dies jedoch in eine Lawine. Es erschöpft Ihren Datenbank-Connection-Pool und lässt Ihren Server abstürzen.
Sie können sich nicht allein auf Code-Reviews verlassen. Sie benötigen eine architektonische Leitplanke.
Laravel bietet den Strict Mode an, um dieses Problem zu lösen. Sie können preventLazyLoading auf Anwendungsebene nutzen. Laravel überwacht Ihre Datenbankbeziehungen. Wenn während der lokalen Entwicklung oder beim Testen ein Lazy Load erkannt wird, wird eine Exception ausgelöst. Dies zwingt Sie dazu, den Code sofort zu korrigieren.
So richten Sie es ein:
Konfigurieren Sie den Sicherheitsmechanismus in Ihrem AppServiceProvider. Tun Sie dies für die lokalen Umgebungen und die Testumgebung. In der Produktion sollten Sie den Fehler protokollieren, anstatt die Anwendung abstürzen zu lassen.
Verwenden Sie diese drei Einstellungen in Ihrer boot-Methode:
Model::preventLazyLoading: Stoppt N+1-Queries.Model::preventSilentlyDiscardingAttributes: Verhindert Fehler bei der Mass Assignment.Model::preventAccessingMissingAttributes: Verhindert Memory Leaks durch fehlende Beziehungen.
Verwenden Sie für die Produktion handleLazyLoadingViolationUsing. Dies ermöglicht es Ihnen, Verstöße an Slack oder einen Logging-Dienst zu protokollieren. Sie erhalten Transparenz, ohne die Benutzererfahrung zu beeinträchtigen.
Das Erzwingen des Strict Mode verlagert die Optimierung an den Anfang Ihrer Pipeline. N+1-Queries können Ihre Tests nicht passieren. Ihr Code bleibt optimiert. Ihre Datenbank bleibt schnell.
Quelle: https://dev.to/iprajapatiparesh/stop-n1-avalanches-enforce-laravel-strict-mode-2oop