Problembeschreibung:
Beim Versuch, mithilfe von Lazy Loading auf Modellbeziehungen zuzugreifen (
Code: Select all
$user->relation
Beispiel für das Problem:
In meinem Fall habe ich eine Kette von Beziehungen:
Code: Select all
auth()->user()->role->permissions
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
}
}
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