Master Laravel Eloquent Relationships: One to One, One to Many, and More!

Abu Sayed
4 min readMar 6, 2024

--

Dive into the world of Laravel Eloquent relationships and learn how to use One to One, One to Many, Has One of Many, Has One Through, and Has Many Through with easy-to-understand explanations, examples, and a mini-program.

Dive into the world of Laravel Eloquent Relationships! This comprehensive guide covers all the essential relationship types — One to One, One to Many, Belongs To, Has One of Many, Has One Through, and Has Many Through. Explore code examples, use cases, and a mini-program to master database modeling like a pro.

Do you ever feel like your Laravel application’s database is a jigsaw puzzle, with multiple tables that need to be connected to create the big picture? Well, you’re not alone! That’s where Laravel Eloquent relationships come into play. They help you link those tables effortlessly, making your life as a developer much easier.

In this blog post, we’ll explore various Eloquent relationships, including One to One, One to Many, One to Many (Inverse)/Belongs To, Has One of Many, Has One Through, and Has Many Through. So, buckle up and get ready to master these essential Laravel concepts!

One to One Relationship

Imagine you have a superhero and their trusty sidekick. There’s only one sidekick for each superhero, and each sidekick is loyal to just one superhero. This is a perfect example of a One to One relationship.

Defining a One to One Relationship

Defining a One to One Relationship

To define a One to One relationship in Laravel, you’ll need to use the hasOne and belongsTo methods in your Eloquent models. Let's consider a simple example: a User model and a Profile model.

// User.php
public function profile()
{
return $this->hasOne(Profile::class);
}
// Profile.php
public function user()
{
return $this->belongsTo(User::class);
}

Retrieving One to One Relationship Data

Retrieving One to One Relationship Data

Now that you’ve defined the relationship, it’s time to retrieve the data. You can access the related model using dynamic properties.

$user = App\Models\User::find(1);
// Access the user's profile
$profile = $user->profile;
// Access the profile's user
$user = $profile->user;

One to Many and One to Many (Inverse)/Belongs To Relationships

Think of a book author who has written multiple books. The author has many books, but each book belongs to only one author. This scenario represents a One to Many relationship and its inverse, Belongs To.

Defining a One to Many Relationship

Defining a One to Many Relationship

Use the hasMany method in the parent model (Author) and the belongsTo method in the child model (Book).

// Author.php
public function books()
{
return $this->hasMany(Book::class);
}
// Book.php
public function author()
{
return $this->belongsTo(Author::class);
}

Retrieving One to Many Relationship Data

Retrieving One to Many Relationship Data

Access the related models using dynamic properties or the with method for eager loading.

$author = App\Models\Author::find(1);
// Access the author's books
$books = $author->books;
// Eager loading
$authorWithBooks = App\Models\Author::with('books')->find(1);
// Access a book's author
$book = App\Models\Book::find(1);
$author = $book->author;

Has One of Many Relationship

Let’s say a company has many employees, but only one can be the CEO. This is an example of a Has One of Many relationship.

Defining a Has One of Many Relationship

Use the hasOne method with a custom constraint to define this relationship.

// Company.php
public function ceo()
{
return $this->hasOne(Employee::class)->where('position', 'CEO');
}

Retrieving Has One of Many Relationship Data

Access the related model using dynamic properties.

$company = App\Models\Company::find(1);
// Access the company's CEO
$ceo = $company->ceo;

Has One Through Relationship

Imagine a country that has many regions, and each region has one governor. To find the governor of a specific region, you can use a Has One Through relationship.

Defining a Has One Through Relationship

Use the hasOneThrough method to define this relationship.

// Country.php
public function governor()
{
return $this->hasOneThrough(Governor::class, Region::class);
}

Retrieving Has One Through Relationship Data

Access the related model using dynamic properties.

$country = App\Models\Country::find(1);
// Access the country's governor (through the region)
$governor = $country->governor;

Has Many Through Relationship

Consider a blog with many categories, and each category has many posts. To find all the posts in specific categories, you can use a Has Many Through relationship.

Defining a Has Many Through Relationship

Use the hasManyThrough method to define this relationship.

// Blog.php
public function posts()
{
return $this->hasManyThrough(Post::class, Category::class);
}

Retrieving Has Many Through Relationship Data

Access the related models using dynamic properties.

$blog = App\Models\Blog::find(1);
// Access the blog's posts (through the categories)
$posts = $blog->posts;

Conclusion

Congratulations! You’ve now explored various Laravel Eloquent relationships and learned how to use them in your applications. These powerful tools will help you navigate the complex world of database relationships with ease.

Remember, practice makes perfect! So, keep experimenting with these relationships in your Laravel projects, and soon, you’ll be a true Eloquent master!

Mini-Program Idea

Create a simple Laravel application that manages a library catalog. Implement One to Many relationships for authors and their books, Has Many Through relationships for categories and their associated books, and One to One relationships for users and their profiles. This mini-program will help you solidify your understanding of Laravel Eloquent relationships. Happy coding!

--

--

Abu Sayed
Abu Sayed

Written by Abu Sayed

Bangladeshi Full Stack Web Dev, Sys Admin & DevOps Engineer. Skills: Data analysis, SQL, Unity, C#. Python, PHP & Laravel. Me on: bd.linkedin.com/in/imabusayed

No responses yet