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.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 modelloUser definisci il metodo profile.
profiles abbia una colonna user_id.
Recupero dei dati correlati
La relazione definita è accessibile come una proprietà.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
_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
comments abbia una colonna post_id.
Recupero dei dati correlati
Una relazionehasMany restituisce una collection.
Relazione inversa (belongsTo)
Per riferirsi al post da un commento, definiscibelongsTo 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, unPost ha più Tag e un Tag appartiene a più Post.
Struttura delle tabelle
Il molti-a-molti richiede una tabella pivot. PerPost 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 + tag → post_tag).Definizione della relazione
Tag puoi navigare la relazione anche nel verso opposto.
Recupero dei dati correlati
Aggiungere e rimuovere associazioni
Conattach aggiungi un record nella tabella pivot, con detach lo rimuovi.
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.Eager loading con with()
Con il metodowith() recuperi in blocco i dati correlati. Le query si riducono a due.
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.Prossimi passi
Introduzione a Eloquent
Ripassa le operazioni CRUD di base di Eloquent.