How to Work With Laravel Eloquent Relationships?

11 minutes read

Laravel Eloquent relationships are a powerful feature that allows you to define and work with relationships between database tables. Eloquent provides various types of relationships, such as one-to-one, one-to-many, many-to-many, and polymorphic relationships.


To work with Laravel Eloquent relationships, you need to follow a few steps:

  1. Define the relationship in the model: In the model class, specify the relationship using Eloquent's fluent method naming conventions. For example, if you have a User model and a Post model, you can define a one-to-many relationship by adding a method named "posts" in the User model.
  2. Implement the relationship methods: In the defined relationship method, use Eloquent's built-in methods to specify the type of relationship and the related model. For example, for the one-to-many relationship between User and Post, you can use the "hasMany" method to specify that a user has multiple posts.
  3. Access the related data: Once the relationship is defined, you can access the related data using the relationship method as a dynamic property. For example, you can retrieve all posts of a user using the syntax "$user->posts".
  4. Lazy loading relationships: Eloquent uses lazy loading by default, which means the related data is loaded only when accessed. This helps in optimizing performance by loading related data only when necessary.
  5. Eager loading relationships: If you know in advance that you will need the related data for multiple records, you can use eager loading to retrieve all related data in a single query. This can be achieved using the "with" method while querying the model.
  6. Working with pivot tables: For many-to-many relationships, where an intermediary table is used to establish the relationship, you can also work with pivot tables. Eloquent provides easy ways to insert, update, or delete records in pivot tables.
  7. Polymorphic relationships: Polymorphic relationships allow a model to belong to multiple other models on a single association. This can be useful in scenarios where a model can be the parent of different types of related models.


These are the key steps involved in working with Laravel Eloquent relationships. By understanding and utilizing these relationships effectively, you can build more maintainable and structured database-driven applications in Laravel.

Best Laravel Frameworks Books to Read in 2024

1
Laravel: Up and Running: A Framework for Building Modern PHP Apps

Rating is 5 out of 5

Laravel: Up and Running: A Framework for Building Modern PHP Apps

2
Beginning Laravel: Build Websites with Laravel 5.8

Rating is 4.9 out of 5

Beginning Laravel: Build Websites with Laravel 5.8

3
Laravel: Up & Running: A Framework for Building Modern PHP Apps

Rating is 4.8 out of 5

Laravel: Up & Running: A Framework for Building Modern PHP Apps

4
Laravel: Up & Running

Rating is 4.7 out of 5

Laravel: Up & Running

5
Practical Laravel: Develop clean MVC web applications

Rating is 4.6 out of 5

Practical Laravel: Develop clean MVC web applications

6
Laravel - Un framework efficace pour développer vos applications PHP

Rating is 4.5 out of 5

Laravel - Un framework efficace pour développer vos applications PHP


How to define the inverse of a Laravel Eloquent relationship?

To define the inverse of a Laravel Eloquent relationship, you can use the belongsTo method. The belongsTo method defines a one-to-many relationship reverse of the hasOne or hasMany relationship.


Example: Let's assume we have two models, User and Post, and the Post model has a foreign key user_id that references the id column of the User model. To define the inverse relationship, you should do the following:

  1. In the User model:
1
2
3
4
public function posts()
{
    return $this->hasMany(Post::class);
}


  1. In the Post model:
1
2
3
4
public function user()
{
    return $this->belongsTo(User::class);
}


In the example above, the User model has a hasMany relationship with the Post model named posts, and the Post model has a belongsTo relationship with the User model named user. This defines the inverse of the relationship, allowing you to access the related User model from a Post model instance by calling $post->user.


How to create a one-to-one relationship in Laravel Eloquent?

To create a one-to-one relationship in Laravel Eloquent, you need to define the relationship between two models using the hasOne and belongsTo methods in the model classes.


Here is an example of creating a one-to-one relationship between User and Profile models:

  1. Create a migration for the users table:
1
php artisan make:migration create_users_table


Inside the migration file, add the necessary columns such as name and email.

  1. Create a migration for the profiles table:
1
php artisan make:migration create_profiles_table


Inside the migration file, add the necessary columns such as user_id, phone, etc. Don't forget to add foreign and references constraints on user_id.

  1. Run the migrations:
1
php artisan migrate


  1. Create User and Profile models using the following commands:
1
2
php artisan make:model User
php artisan make:model Profile


  1. Define the relationship in the User model:
1
2
3
4
5
6
7
class User extends Model
{
    public function profile()
    {
        return $this->hasOne(Profile::class);
    }
}


  1. Define the relationship in the Profile model:
1
2
3
4
5
6
7
class Profile extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}


  1. You can now access the related profile from a user:
1
2
$user = User::find(1);
$profile = $user->profile;


And vice versa, you can access the related user from a profile:

1
2
$profile = Profile::find(1);
$user = $profile->user;


Note that in this example, the users table has a foreign key user_id in the profiles table.


How to create a morph many relationship in Laravel Eloquent?

In Laravel Eloquent, you can create a polymorphic many-to-many relationship using the morphToMany method. Here are the steps to create a morph many relationship in Laravel Eloquent:

  1. Define the relationship in the models: First, define the many-to-many relationship in the model that has the polymorphic association. Let's say we have a Post model that can have many tags: // Post.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Post extends Model { public function tags() { return $this->morphToMany(Tag::class, 'taggable'); } } Then, define the inverse relationship in the related model. In this case, let's assume there is a Tag model: // Tag.php namespace App\Models; use Illuminate\Database\Eloquent\Model; class Tag extends Model { public function posts() { return $this->morphedByMany(Post::class, 'taggable'); } }
  2. Create a migration for the pivot table: You need to create a migration for the pivot table that will hold the morphable relationships. The table name convention should be table_nameable_type where "table_name" references the table name of the model and "type" refers to the morphable model type (e.g., posts, videos, etc.). Assuming we want to create a pivot table for the Post and Tag models, the migration could be: php artisan make:migration create_post_tag_table --create=post_tag And in the generated migration file: // create_post_tag_table.php // ... public function up() { Schema::create('post_tag', function (Blueprint $table) { $table->unsignedBigInteger('post_id'); $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade'); $table->unsignedBigInteger('tag_id'); $table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade'); $table->string('taggable_type'); // adds the morphable type $table->unsignedBigInteger('taggable_id'); $table->timestamps(); }); } // ...
  3. Use the relationship in your code: Once the relationship and the pivot table are defined, you can use the tags() relationship in your code to retrieve and associate tags with the post model: // Retrieve tags for a post $post = App\Models\Post::find(1); $tags = $post->tags; // Associate tags with a post $post = App\Models\Post::find(1); $post->tags()->attach([1, 2, 3]); // Detach tags from a post $post = App\Models\Post::find(1); $post->tags()->detach([1, 2, 3]);


That's it! You have now created a morph many relationship in Laravel Eloquent using the morphToMany method.


How to work with pivot table in Laravel Eloquent relationships?

To work with pivot table in Laravel Eloquent relationships, you can follow these steps:

  1. Define the relationships between your models using Eloquent's belongsToMany method. For example, if you have a User model and a Role model, a user can have multiple roles and a role can belong to multiple users. So, you can define the relationship in both models as follows:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// User model
public function roles()
{
    return $this->belongsToMany(Role::class)->withPivot('additional_data');
}

// Role model
public function users()
{
    return $this->belongsToMany(User::class)->withPivot('additional_data');
}


  1. Create a pivot table that has a foreign key column for each model's primary key. For example, create a role_user table with role_id and user_id columns. You can also include any additional data specific to the relationship in this pivot table, such as additional_data in the above example.
  2. Use the pivot table to query and work with the relationships. For example, you can retrieve all users with their roles and additional data like this:
1
2
3
4
5
6
7
$users = User::with('roles')->get();

foreach ($users as $user) {
    foreach ($user->roles as $role) {
        echo $user->name . ': ' . $role->name . ' (' . $role->pivot->additional_data . ')<br>';
    }
}


This will loop through all users and their roles, and you can access the additional data using the pivot attribute.


You can also use various methods like attach(), detach(), sync(), etc. to add, remove, or sync the relationships through the pivot table.


Note that the naming convention for the pivot table is important. By default, Laravel assumes the table name is the plural form of the two related model names in alphabetical order. However, you can specify a custom pivot table name using the table method in the relationship definition.


For example:

1
2
3
4
public function roles()
{
    return $this->belongsToMany(Role::class)->withPivot('additional_data')->table('custom_user_roles');
}


This will use the custom_user_roles table as the pivot table instead of the default role_user table.

Facebook Twitter LinkedIn Telegram Whatsapp Pocket

Related Posts:

In Eloquent, the ORM provided by the Laravel framework, working with relationships between database tables is a common task. Eloquent provides various methods and techniques to define and interact with these relationships to make it easy to work with related d...
To use Eloquent ORM in Laravel, you first need to create a model class that extends the Eloquent model class provided by Laravel. This model class will represent a table in your database.Next, you can define relationships between your models using Eloquent&#39...
To make a query between two tables in Laravel, you can use Eloquent relationships. First, define the relationship between the two tables in their respective models using functions like hasOne, hasMany, belongsTo, or belongsToMany. Once the relationships are de...