Cos’è un modello pivot personalizzato
La tabella intermedia di belongsToMany (molti-a-molti) è, per impostazione predefinita, trattata come una semplice istanza diIlluminate\Database\Eloquent\Relations\Pivot. Se vuoi che la tabella intermedia contenga colonne aggiuntive (data di approvazione, tipo di ruolo, ecc.) o se vuoi aggiungere accessor, mutator e metodi personalizzati, puoi creare un modello personalizzato che estende Pivot.
belongsToMany chiama using() per indicare alla relazione di usare questo modello personalizzato.
Quando salvi un modello pivot personalizzato, denomina la classe usando sempre il singolare in ordine alfabetico (
RoleUser e non UserRole). Si tratta però di una convenzione di denominazione: sei libero di scegliere il nome effettivo della classe.Specificare gli attributi da recuperare con as()
Per impostazione predefinita, i valori della tabella intermedia si consultano attraverso la proprietà pivot. Con il metodo as() puoi cambiare questo nome.
Colonne aggiuntive e timestamp
Se la tabella intermedia ha colonne aggiuntive comeapproved, includile esplicitamente tra quelle da recuperare con withPivot(). Per gestire created_at / updated_at, chiama withTimestamps().
Riferimenti inversi dal modello pivot
In un modello pivot personalizzato puoi definire liberamente relazionibelongsTo verso il modello dichiarante e il modello correlato.
$roleUser->role o $roleUser->user. Se però vuoi che queste relazioni vengano eager loaded automaticamente al momento dell’esecuzione della query padre, puoi usare il metodo chaperone() descritto qui sotto.
Eager loading automatico con chaperone() (Laravel 13)
Laravel 13 ha aggiunto il metodo chaperone(), che permette di idratare automaticamente (l’equivalente dell’eager loading) le relazioni belongsTo come role() / user() definite sul modello pivot quando la query belongsToMany viene eseguita.
chaperone(), Eloquent deduce automaticamente i nomi delle relazioni belongsTo presenti sul modello pivot (RoleUser) e, quando recuperi una collezione con qualcosa come Role::with('users'), imposta senza query aggiuntive i riferimenti al modello dichiarante e al modello correlato per ciascun pivot.
Quando i nomi delle relazioni non sono standard
Se il nome del metodobelongsTo sul modello pivot non segue la denominazione standard (camelCase singolare del nome del modello dichiarante o correlato), specificalo esplicitamente tramite gli argomenti di chaperone().
Prossimi passi
Relazioni
Torna a rivedere come definire le relazioni di base, incluso belongsToMany.
Eloquent Observers ed eventi del modello
Impara come usare gli eventi del modello per intercettare salvataggi e aggiornamenti del modello pivot.