Skip to main content

Cosa sono le relazioni

Le tabelle di un database sono spesso correlate tra loro. Ad esempio, un post di blog ha molti commenti, oppure un ordine è collegato all’utente che l’ha effettuato. Eloquent offre un modo semplice per definire e manipolare queste relazioni tra tabelle. Le relazioni si definiscono come metodi sui modelli Eloquent.
In questa pagina usiamo come esempio modelli concreti come User, Post, Comment e Tag. Diamo per scontato che modelli e tabelle siano già stati creati.
Le principali relazioni supportate da Eloquent sono le seguenti.

hasOne (1-a-1)

hasOne rappresenta una relazione in cui un modello possiede esattamente un altro modello. Ad esempio, un User ha un Profile.

Definizione della relazione

Nel modello User definisci il metodo profile.
Eloquent deduce automaticamente la chiave esterna dal nome del modello padre. Assume che la tabella profiles abbia una colonna user_id.

Recupero dei dati correlati

La relazione definita è accessibile come una proprietà.
Chiamando il metodo di relazione come una proprietà, Eloquent emette automaticamente la query e restituisce i dati correlati. Questa è la “dynamic relationship property”.

belongsTo (inverso di 1-a-1)

belongsTo è l’inverso di hasOne e va definito sul modello che possiede la chiave esterna. Rappresenta la relazione “un Profile appartiene a un User”.

Definizione della relazione

Eloquent usa come chiave esterna la colonna con nome-del-metodo + _id (in questo caso user_id).

Recupero dei dati correlati

hasMany (1-a-molti)

hasMany è la relazione più usata: un modello padre possiede più figli. Ad esempio, un Post ha più Comment.

Definizione della relazione

Eloquent assume che la tabella comments abbia una colonna post_id.

Recupero dei dati correlati

Una relazione hasMany restituisce una collection.
Puoi anche aggiungere condizioni alla query.

Relazione inversa (belongsTo)

Per riferirsi al post da un commento, definisci belongsTo sul modello Comment.

belongsToMany (molti-a-molti)

La relazione molti-a-molti si usa quando entrambi i modelli hanno molteplici associazioni tra loro. Ad esempio, un Post ha più Tag e un Tag appartiene a più Post.

Struttura delle tabelle

Il molti-a-molti richiede una tabella pivot. Per Post e Tag prepara la tabella pivot post_tag.
Il nome della tabella pivot viene dedotto automaticamente concatenando in ordine alfabetico i nomi dei due modelli correlati (post + tagpost_tag).

Definizione della relazione

Definendola in modo analogo anche sul lato Tag puoi navigare la relazione anche nel verso opposto.

Recupero dei dati correlati

Aggiungere e rimuovere associazioni

Con attach aggiungi un record nella tabella pivot, con detach lo rimuovi.
Con sync i record della tabella pivot che non corrispondono agli ID passati vengono eliminati automaticamente, lasciando solo quelli indicati.

Eager loading

Cos’è il problema N+1

Accedendo a una relazione come proprietà, Eloquent emette una query ogni volta. Questo è il “lazy loading”. Se accedi alla relazione in un ciclo, incorri nel problema N+1.
Con 100 post fai 101 query in totale. Ha un forte impatto sulle prestazioni.

Eager loading con with()

Con il metodo with() recuperi in blocco i dati correlati. Le query si riducono a due.
L’SQL eseguito è solo questo:

Eager load di più relazioni contemporaneamente

Puoi indicare più relazioni con un array.

Eager load annidato

Con la notazione dot puoi fare eager load anche di relazioni annidate.
L’eager loading è fondamentale per prevenire il problema N+1. Prendi l’abitudine di usare with() ogni volta che accedi a relazioni all’interno di un ciclo.

Prossimi passi

Introduzione a Eloquent

Ripassa le operazioni CRUD di base di Eloquent.
Ultima modifica il 13 luglio 2026