Prendiamo due Model: Category e Product. Per costruire una relazione tra i due Model utilizziamo una relazione Many-to-One e One-to-Many:
Cosa abbiamo fatto? Siamo andati nel Model Product.php e abbiamo creato un metodo pubblico, cioè raggiungibile da qualsiasi punto dell'applicazione, chiamato category.
Perché abbiamo chiamato il metodo al singolare, cioè category? Facciamo un ragionamento: quindi noi diciamo che un Product appartiene a una sola Category. Abbiamo quindi una relazione Many-to-One, cioè molti prodotti appartengono a una sola categoria. Per questo motivo utilizziamo il nome category al singolare.
Poi abbiamo utilizzato il metodo belongsTo, che indica che il Model Product appartiene al Model Category.
Scrivendo Category::class indichiamo la classe Category, il cui namespace, normalmente, è App\Models\Category.
Cosa dobbiamo scrivere nel Model Category?
Penso che abbiate già capito tutto. Qui diciamo che il Model Category ha molti Product, quindi definiamo la relazione inversa: una categoria può avere molti prodotti.
Come andiamo a chiamare queste relazioni nel codice, ad esempio all'interno del Controller di riferimento?
In questo caso recuperiamo la Category con ID 1 e, tramite la relazione products, otteniamo tutti i prodotti appartenenti a quella categoria.
In questo secondo caso recuperiamo il Product con ID 1 e, tramite la relazione category, accediamo alla categoria a cui appartiene. Possiamo quindi leggere, ad esempio, il suo title.
Vediamo ora la relazione Many-to-Many, cioè una relazione molti-a-molti.
Prendiamo come esempio due Model: Product e Tag. Un prodotto può avere più tag e, allo stesso tempo, un tag può essere associato a più prodotti.
In questo caso abbiamo quindi una relazione Many-to-Many:
Cosa abbiamo fatto? Siamo andati nel Model Product.php e abbiamo creato un metodo pubblico chiamato tags. Lo abbiamo chiamato al plurale perché un prodotto può avere più tag.
Utilizziamo il metodo belongsToMany() perché stiamo dicendo a Laravel che un Product può essere associato a molti Tag e che ogni Tag può essere associato a molti Product.
Nel Model Tag.php definiamo la relazione inversa:
Anche in questo caso utilizziamo belongsToMany(), perché un Tag può essere associato a molti prodotti.
Ma come fa Laravel a sapere quali prodotti sono associati a quali tag? Nelle relazioni Many-to-Many viene utilizzata una terza tabella, chiamata tabella pivot.
Nel nostro esempio possiamo avere una tabella chiamata product_tag, contenente almeno due colonne:
Ogni riga della tabella pivot rappresenta un'associazione tra un prodotto e un tag.