Laravel Many to Many Polymorphic Relationship Example
Laravel 29-Dec-2020

Laravel Many to Many Polymorphic Relationship Example

In this tutorial, you will learn about laravel many to many polymorphic relationship and how to use create, and retrieve records from database tables using this relationship.

Using “morphToMany()” and “morphedByMany()” eloquent method, you can create Many to Many Polymorphic Relationship in your laravel eloquent models.

This tutorial show

Laravel Many to Many Polymorphic Relationship Example

Follow the following steps to create many to many polymorphic relationship and learn how to use this relationship:

Step 1: Create Migration File

First of all, create posts, videos, tags and taggables migration files with following files:

database/migrations/posts

Schema::create('posts', function (Blueprint $table) {
 
    $table->bigIncrements('id');
 
    $table->string("name");
 
    $table->timestamps();
 
});

database/migrations/videos 

Schema::create('videos', function (Blueprint $table) {
 
    $table->bigIncrements('id');
 
    $table->string("name");
 
    $table->timestamps();
 
});

database/migrations/tags 

Schema::create('tags', function (Blueprint $table) {
 
    $table->bigIncrements('id');
 
    $table->string("name");
 
    $table->timestamps();
 
});

database/migrations/taggables 

Schema::create('taggables', function (Blueprint $table) {
 
    $table->integer("tag_id");
 
    $table->integer("taggable_id");
 
    $table->string("taggable_type");
 
});

Step 2: Create many to many polymorphic relationships in model

Next, create many to many polymorphic relationships as follow:

app/Post.php

namespace App;
  
use Illuminate\Database\Eloquent\Model;
  
class Post extends Model
{
    
    public function tags()
    {
        return $this->morphToMany(Tag::class, 'taggable');
    }
}

app/Video.php

namespace App;
  
use Illuminate\Database\Eloquent\Model;
  
class Video extends Model
{
 
    public function tags()
    {
        return $this->morphToMany(Tag::class, 'taggable');
    }
}

app/Tag.php

namespace App;
  
use Illuminate\Database\Eloquent\Model;
  
class Tag extends Model
{
    
    public function posts()
    {
        return $this->morphedByMany(Post::class, 'taggable');
    }
  
    public function videos()
    {
        return $this->morphedByMany(Video::class, 'taggable');
    }
}

Step 3: Insert and retrieve a record using many to many polymorphic relationship

Now you will learn how to insert and retrieve a record from posts, videos tags, and taggables table using many to many polymorphic relationship:

Retrieve Records From table

Find post tags as follow:

$post = Post::find(1);  
  
dd($post->tags);

Find video tags as follow:

$video = Video::find(1);    
  
dd($video->tags);

and you can find post and video of a specific tag like

$tag = Tag::find(1);    
  
dd($tag->posts);
$tag = Tag::find(1);    
  
dd($tag->videos);

Insert Records in Table

Insert tag for the following post into DB table as follow:

$post = Post::find(1);  
  
$tag = new Tag;
$tag->name = "Laravel";
  
$post->tags()->save($tag);

Insert tag for the following video into DB table as follow:

$video = Video::find(1);    
  
$tag = new Tag;
$tag->name = "Madona";
  
$video->tags()->save($tag);

Insert Multiple Tags for Post:

$post = Post::find(1);  
  
$tag1 = new Tag;
$tag1->name = "Laravel";
  
$tag2 = new Tag;
$tag2->name = "jQuery";
  
$post->tags()->saveMany([$tag1, $tag2]);

Using sync or attach to insert multiple tag as follow:

$post = Post::find(1);  
  
$tag1 = Tag::find(3);
$tag2 = Tag::find(4);
  
$post->tags()->attach([$tag1->id, $tag2->id]);

Or use sync

$post = Post::find(1);  
  
$tag1 = Tag::find(3);
$tag2 = Tag::find(4);
  
$post->tags()->sync([$tag1->id, $tag2->id]);

Conclusion
In this tutorial, you have learned how to create and use many to many polymorphic relationship in laravel apps.