WhatsApp: +39 339 289 627 8
E-mail: info@creazione-siti-web.eu

 

Laravel Model: relazioni Many-to-One e Many-to-Many

 

Prendiamo due Model: Category e Product. Per costruire una relazione tra i due Model utilizziamo una relazione Many-to-One e One-to-Many:

public function category(): BelongsTo { return $this->belongsTo(Category::class); }

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?

public function products(): HasMany { return $this->hasMany(Product::class); }

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?

$products = Category::find(1)->products; foreach ($products as $product) { // ... }

In questo caso recuperiamo la Category con ID 1 e, tramite la relazione products, otteniamo tutti i prodotti appartenenti a quella categoria.

$product = Product::find(1); $product->category->title; // Per esempio, leggiamo il titolo della 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:

public function tags(): BelongsToMany { return $this->belongsToMany(Tag::class); }

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:

public function products(): BelongsToMany { return $this->belongsToMany(Product::class); }

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:

product_id; tag_id

Ogni riga della tabella pivot rappresenta un'associazione tra un prodotto e un tag.