Sling Academy
Home/PHP/What are pivot tables in Laravel Eloquent: Explained with examples

What are pivot tables in Laravel Eloquent: Explained with examples

Last updated: January 18, 2024

Introduction

Pivot tables serve as an intermediary for many-to-many relationships in Laravel’s Eloquent ORM. They are used when a relationship is too intricate to be defined by just one table. A pivot table holds the foreign keys from two other tables, effectively glueing them together in relation.

In Laravel, working with many-to-many relations is a breeze using Eloquent which provides simple methods to retrieve and update related model data. This tutorial aims to explain the concept of pivot tables and illustrate their use within the Laravel framework with practical examples.

Understanding Many-to-Many Relationships

A standard many-to-many relationship involves two models. For example, let’s consider Users and Roles. A user can have multiple roles, and a role can be assigned to multiple users. The pivot table will contain the user_id and role_id columns.

Creating a Pivot Table

Firstly, you’ll need to define the pivot table schema and migrate it to the database:

Schema::create('role_user', function (Blueprint $table) {
    $table->unsignedBigInteger('user_id');
    $table->unsignedBigInteger('role_id');
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    $table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
    $table->primary(['user_id', 'role_id']);
    $table->timestamps();
});

This table role_user is our pivot table, which contains foreign keys to our users and roles table, and bindings for cascading on deletions to maintain integrity.

Defining The Relationship

In the User model, we would define a roles() method that outlines this relationship:

public function roles() {
    return $this->belongsToMany(Role::class);
}

Similarly, in the Role model, you’d have:

public function users() {
    return $this->belongsToMany(User::class);
}

Interacting with Pivot Tables

To associate roles with a user, Eloquent’s attach method comes in handy:

$user = User::find(1);
$user->roles()->attach($roleId);

Retrieving Pivot Data

When retrieving records from pivot tables, Eloquent helps you access pivot table attributes:

$user = User::find(1);
foreach ($user->roles as $role) {
    echo $role->pivot->created_at;
}

Updating Pivot Data

To update an existing role entry for a user, you can use the updateExistingPivot method:

$user = User::find(1);
$user->roles()->updateExistingPivot($roleId, ['column' => 'value']);

Detaching Records

And to remove associations:

$user = User::find(1);
$user->roles()->detach($roleId);

Advanced Pivot Table Interactions

Pivot tables are not limited to storing just the foreign keys. You can add additional fields to capture more data about the relationship. For example, we could add an ‘expires_at’ column to the pivot table:

Schema::table('role_user', function (Blueprint $table) {
    $table->dateTime('expires_at')->nullable();
});

And now you’d define the relationship with the withPivot method to include the extra attribute:

public function roles() {
    return $this->belongsToMany(Role::class)->withPivot('expires_at');
}

Handling Custom Pivot Models

Sometimes you might need your pivot table to behave like a full Eloquent model. To do this, you can create a custom pivot model.

use Illuminate\Database\Eloquent\Relations\Pivot;

class RoleUser extends Pivot {
    // ...
}

Be sure to instruct the relationship to use this custom model:

public function roles() {
    return $this->belongsToMany(Role::class)->using(RoleUser::class);
}

This way, RoleUser acts as a normal Eloquent model and can have its own methods, relationships, and traits.

Conclusion

Pivot tables are an essential aspect of Eloquent, and they empower developers to manage many-to-many relationships with ease and precision. By understanding and utilizing pivot tables, developers can effectively structure and interact with complex data in a Laravel application.

In this tutorial, we’ve explored the basic and advanced concepts of using pivot tables within Laravel Eloquent, complete with examples for clearer understanding. With a bit of practice, you’ll be leveraging pivot tables to build more flexible and feature-rich applications in no time.

Next Article: Laravel Eloquent: attach(), detach(), and sync() methods

Previous Article: Eloquent: How to get an array of all table names

Series: Laravel & Eloquent Tutorials

PHP

You May Also Like

  • Pandas DataFrame.value_counts() method: Explained with examples
  • Constructor Property Promotion in PHP: Tutorial & Examples
  • Understanding mixed types in PHP (5 examples)
  • Union Types in PHP: A practical guide (5 examples)
  • PHP: How to implement type checking in a function (PHP 8+)
  • Symfony + Doctrine: Implementing cursor-based pagination
  • Laravel + Eloquent: How to Group Data by Multiple Columns
  • PHP: How to convert CSV data to HTML tables
  • Using ‘never’ return type in PHP (PHP 8.1+)
  • Nullable (Optional) Types in PHP: A practical guide (5 examples)
  • Explore Attributes (Annotations) in Modern PHP (5 examples)
  • An introduction to WeakMap in PHP (6 examples)
  • Type Declarations for Class Properties in PHP (5 examples)
  • Static Return Type in PHP: Explained with examples
  • PHP: Using DocBlock comments to annotate variables
  • PHP: How to ping a server/website and get the response time
  • PHP: 3 Ways to Get City/Country from IP Address
  • PHP: How to find the mode(s) of an array (4 examples)
  • PHP: Calculate standard deviation & variance of an array