Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon What are the differences between morphToMany and morphedByMany in Laravel


What are the differences between morphToMany and morphedByMany in Laravel


In Laravel, both `morphToMany` and `morphedByMany` are used to define many-to-many polymorphic relationships, but they serve different roles in the relationship setup.

morphToMany

- This method is used on the model that owns or initiates the polymorphic many-to-many relationship.
- It defines the relationship from the perspective of the model that is related to multiple other models through a polymorphic pivot table.
- For example, if you have `Post` and `Video` models that can be tagged, in the `Post` and `Video` models you define the `tags()` method using `morphToMany` to get all tags associated with that model.
- It accepts the related model class and the "name" of the polymorphic relation (e.g., `'taggable'`), which corresponds to the morph prefix used in the pivot table columns (`taggable_id` and `taggable_type`).

php
class Post extends Model {
    public function tags() {
        return $this->morphToMany(Tag::class, 'taggable');
    }
}

morphedByMany

- This method is used on the inverse side of the polymorphic many-to-many relationship.
- It defines the relationship from the perspective of the related model that is associated with multiple other models.
- Continuing the example above, in the `Tag` model you define methods like `posts()` and `videos()` using `morphedByMany` to get all posts or videos associated with a given tag.
- It accepts the related model class and the morph name, allowing Laravel to retrieve all models of that type that are related to the current model.

php
class Tag extends Model {
    public function posts() {
        return $this->morphedByMany(Post::class, 'taggable');
    }

    public function videos() {
        return $this->morphedByMany(Video::class, 'taggable');
    }
}

Summary of Differences

- Role in relationship:
- `morphToMany` is defined on the model that "owns" or "has" the polymorphic relation (e.g., `Post` or `Video` having many tags).
- `morphedByMany` is defined on the model that is "related to" or "tagged by" the polymorphic owners (e.g., `Tag` knowing which posts or videos it belongs to).

- Direction:
- `morphToMany` is the forward relation from the polymorphic model to the related model.
- `morphedByMany` is the inverse relation from the related model back to the polymorphic models.

- Typical usage:
- Use `morphToMany` on models like `Post` or `Video` to get their tags.
- Use `morphedByMany` on the `Tag` model to get all posts or videos tagged with it.

This pattern allows Laravel to manage many-to-many polymorphic relationships cleanly with a single pivot table that includes `taggable_id` and `taggable_type` columns, supporting relationships between multiple models and a shared related model like `Tag`[1][3][5][7].

Example Context

- Tables: `posts`, `videos`, `tags`, and a pivot table `taggables` with columns `tag_id`, `taggable_id`, `taggable_type`.
- Models:
- `Post` and `Video` use `morphToMany(Tag::class, 'taggable')` to get tags.
- `Tag` uses `morphedByMany(Post::class, 'taggable')` and `morphedByMany(Video::class, 'taggable')` to get all posts and videos tagged with it.

This setup enables flexible many-to-many polymorphic relationships in Laravel's Eloquent ORM.

Citations:
[1] https://laravel.com/docs/11.x/eloquent-relationships
[2] https://stackoverflow.com/questions/75729230/laravel-polymorphic-relationships-morphto-morphmany-or-regular-relationships
[3] https://www.sitepoint.com/eloquents-polymorphic-relationships-explained/
[4] https://laracasts.com/discuss/channels/eloquent/eloquents-morphedbymany-method
[5] https://blog.logrocket.com/polymorphic-relationships-laravel/
[6] https://stackoverflow.com/questions/43496503/laravel-polymorphic-types-table-vs-many-types-tables
[7] https://laraveldaily.com/post/laravel-polymorphic-many-to-many-get-all-related-records
[8] https://laracasts.com/discuss/channels/laravel/solving-this-polymorphic-many-to-many-relationship
[9] https://simple-code.agency/blog/development/simplifying-many-to-many-relationships-with-laravel-polymorphic-relations