Skip to main content

Cos’è un modello pivot personalizzato

La tabella intermedia di belongsToMany (molti-a-molti) è, per impostazione predefinita, trattata come una semplice istanza di Illuminate\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.
Nella definizione di 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 come approved, includile esplicitamente tra quelle da recuperare con withPivot(). Per gestire created_at / updated_at, chiama withTimestamps().
Eloquent aggiorna automaticamente updated_at sulla tabella intermedia solo quando il modello pivot è specificato esplicitamente con using(). Anche usando la classe Pivot predefinita withTimestamps() funziona, ma specificando un modello personalizzato con using() puoi sfruttare eventi personalizzati, cast personalizzati e altro ancora.

Riferimenti inversi dal modello pivot

In un modello pivot personalizzato puoi definire liberamente relazioni belongsTo verso il modello dichiarante e il modello correlato.
In questo modo, anche quando ottieni un modello pivot in modo indipendente, puoi accedere ai modelli correlati con $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.
Quando chiami 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 metodo belongsTo sul modello pivot non segue la denominazione standard (camelCase singolare del nome del modello dichiarante o correlato), specificalo esplicitamente tramite gli argomenti di chaperone().
chaperone() è un meccanismo che risolve il “problema N+1” anche per i riferimenti che passano dalla tabella intermedia. Nelle applicazioni che consultano spesso informazioni del modello padre a partire dal pivot (ad esempio per mostrare insieme data di approvazione e nome utente), abbinarlo al classico eager loading con with() è particolarmente efficace.

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.
Ultima modifica il 11 settembre 2026