Laravel: Das verzögerte Laden von Modellbeziehungen funktioniert in der boot()-Methode nicht ordnungsgemäß – lädt alle DPhp

PHP-Programmierer chatten hier
Guest
 Laravel: Das verzögerte Laden von Modellbeziehungen funktioniert in der boot()-Methode nicht ordnungsgemäß – lädt alle D

Post by Guest »

Ich stoße auf ein ungewöhnliches Verhalten beim verzögerten Laden von Beziehungen in der boot()-Methode von Laravel.
Problembeschreibung:
Beim Versuch, mithilfe von Lazy Loading auf Modellbeziehungen zuzugreifen (

Code: Select all

$user->relation
) in der boot()-Methode scheint Laravel die Beziehungskonfigurationen nicht richtig zu handhaben. Wenn ich die Beziehung jedoch explizit mit $user->load('relation') vorab lade, funktioniert alles wie erwartet.
Beispiel für das Problem:
In meinem Fall habe ich eine Kette von Beziehungen:

Code: Select all

auth()->user()->role->permissions
Dies führt unerwartet dazu, dass Laravel zuerst eine einzelne Rolle abruft (mit LIMIT 1) und dann ALLE Berechtigungen aus der Tabelle „role_permissions“ lädt.
Um dieses Verhalten zu überprüfen, habe ich eine Testbeziehung erstellt direkt vom Benutzer zur Tabelle „role_permissions“ und das Ergebnis war dasselbe: Es werden alle Zeilen aus der Tabelle „role_permissions“ geladen.
Was ich versucht habe:
Ich werde es verwenden $user in diesem Beispiel, aber dies gilt für jedes hydratisierte Modell innerhalb der boot()-Methode.
Lazy Loading direkt verwenden: $user->relation
Eager verwenden Laden: $user->load('role.permissions')

Code: Select all

class Contractor extends AbstractModel
{

public static function boot()
{
// Scenario 1
auth()->user()->role->permissions; // incorrect - all records from role_permissions

// Scenario 2
$user = User::find(auth()->user()->id);
$user->role->permissions; // incorrect - all records from role_permissions

// Scenario 3
auth()->user()->load('role.permissions');
auth()->user()->role->permissions; // correct records

// Some other logic
}
}
Der Eager-Loading-Ansatz funktioniert ordnungsgemäß, während Lazy Loading unerwartetes Verhalten zeigt.
Fragen:
Ist Dies ist eine bekannte Einschränkung der boot()-Methode von Laravel?
Warum verhält sich Lazy Loading in boot() anders als bei anderen Methoden?
Gibt es einen empfohlenen Ansatz für den Umgang mit Beziehungen? Laden in boot()?
Umgebung:
Laravel-Version: 11
PHP-Version: 8.2

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post