Search code examples
ormlaravellaravel-4relationshipeloquent

Many To Many relationships in Laravel: belongsToMany() vs. hasManyThrough()


What is the difference between using belongsToMany() or hasManyThrough() when defining a Many To Many relationship in Laravel?

Example: User Account Account_User

So, User has a many to many relation to Account via the Account_User table. On top of being just the pivot table that defines the related Users with related Accounts, it also stores a Account_User.role field, which determines which role a given user has in a given account.

What would the implications be of using either User belongsToMany() Account or User hasManyThrough() Account Account_User? Or is this essentially the same?

When decided upon a method, I guess I should use the same method for the reverse relation definition.


Solution

  • Let's say you have two models, let's call A and B:

    If A may have more than one items of B, and also If B may have more than one items of A (think like blog posts / tags) You have to use belongsToMany();

    Now let's say you have 3 models, A, B and C.

    A is related to B, and B is related to C. But you need to access all C's which is related to A (over B), then you need to use hasManyThrough() (think like countries -> users -> posts , and you need all posts from specific country)

    hasManyThrough() is not totally meant for many to many relationships, it's more like a shortcut.

    Check the documentation links, 1, 2 (Laravel 4.2), or 3, 4 (Laravel 5.x).