Le relazioni polimorfiche sono uno speciale tipo di relazione che permette di associare modelli di diverse classi.
morphMany
Prendiamo, ad esempio tre modelli: Post, Video e Commenti.
Entrambi i modelli Post e Video possono avere dei commenti associati.
A differenza di hasMany, grazie al "polimorfismo" possiamo utilizzare un solo modello Commenti che può essere relazionato sia ai modelli Post sia ai modelli Video.
morphMany: la struttura
Seguendo l'esempio, questa potrebbe essere la struttura nel nostro database.
# tab posts
id
content
# tab videos
id
video_url
# tab comments
id
content
commentable_id
commentable_type
Soffermiamoci nella tabella comments.
Le colonne commentable_id e commentable_type permettono di creare un'astrazione per identificare oggetti da commentare.
commentable_idconterrà l'id delPosto delVideoda commentarecommentable_typeconterrà un riferimento, sotto forma di stringa, della classe alla quale l'id fa riferimento
id content commentable_id commentable_type
1 ... 1 App/Models/Post
2 ... 1 App/Models/Video
Settare la relazione
Ecco come settare la relazione nei modelli:
// model Post
public function comments() {
return $this->morphMany(Comment::class, 'commentable');
}
// model Video
public function comments() {
return $this->morphMany(Comment::class, 'commentable');
}
// model Comment
public function commentable() {
return $this->morphTo();
}

