aBhijit
aBhijit

Reputation: 5361

Laravel - Database relationships

Let's consider a simple scenario of 'Company' and 'Employee' models.

A company has many employees. Now, when I map this relationship in Laravel, what is the correct approach from the following?

Approach 1:

Employee belongsTo() Company and Company hasMany() Employee

Approach 2:

Company belongsToMany() Employee and Employee hasOne() Company

Basically, what is the difference between belongsTo()-hasMany() and belongsToMany()-hasOne()?

Upvotes: 2

Views: 444

Answers (1)

Joel Hinz
Joel Hinz

Reputation: 25374

There are three different approaches, in your question you're mixing them up a little. I'll go through all of them.

Many-to-many

A many-to-many relationship would mean, in your example, that a company can have multiple employees and that an employee can work for multiple companies.

So when you're using the belongsToMany() method on a relation, that implies you have a pivot table. Laravel by default assumes that this table is named after both other tables, e.g. company_employee in the example. Both the Company model and the Employee model would then have belongsToMany() relations.

Many-to-one

However, using hasMany() means that it's a one-to-many relationship. If we look at the example again, a company might have many employees but each employee would only be able to be employed by one company.

In the models, that means the Company would have a hasMany() method in its relationship declaration, while the Employee would have a belongsTo() method.

One-to-one

Finally, hasOne() means that it's a one-to-one relationship. What it would mean in your example is that each company may only have one employee. Since the inverse of hasOne() is also belongsTo(), in this scenario, too, every employee could be employed by only one company.

The Company model would then have a hasOne() relationship method, with the Employee having a belongsTo() method.


In practice, you almost always want to construct a database that is as close to reality in its representation as possible. What relationships you use depends on what your case looks like. In the example, I would guess that you want a many-to-one approach, with a foreign key on the employees table, that references the id on the companies table. But ultimately, that's up to you. Hope that helped. :)

Upvotes: 1

Related Questions