Laravel 8 Many To Many Polymorphic Relationship


In this article, we will see laravel 8 many to many polymorphic relationships. Many to many polymorphic relationships are more complicated compared to morph one and morph many relationships.

Many to many polymorphic relationships can use in laravel 6, laravel 7, and laravel 8 and for access, many to many polymorphic relationships use morphToMany() and morphedByMany().

In this example, we will create migration for posts, taggables, and videos and also create model Post, Taggable, and Video. Also, see create records, retrieve records, and attach records.

laravel_8_many_to_many_polymorphic_relationship

 

 

Create Migration:

Now we will create migration for posts, tags, videos, and taggable tables.

Posts Table:

Schema::create('posts', function (Blueprint $table) {

    $table->increments('id');

    $table->string("name");

    $table->timestamps();

});

 

Tags Table:

Schema::create('tags', function (Blueprint $table) {

    $table->increments('id');

    $table->string("name");

    $table->timestamps();

});

 

Videos Table:

Schema::create('videos', function (Blueprint $table) {

    $table->increments('id');

    $table->string("name");

    $table->timestamps();

});

 

Taggables Table:

Schema::create('taggables', function (Blueprint $table) {

    $table->integer("tag_id");

    $table->integer("taggable_id");

    $table->string("taggable_type");

});

 

 

Create Model:

Now, we will create Post, Tag, and Video model. we will also use morphToMany() and morphedByMany() for relationship of both model.

Post Model:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    /**
     * Get all of the tags for the post.
     */
    public function tags()
    {
        return $this->morphToMany(Tag::class, 'taggable');
    }
}

 

Video Model:

<?php
 
namespace App;
 
use Illuminate\Database\Eloquent\Model;
 
class Video extends Model
{
    /**
     * Get all of the tags for the video.
     */
    public function tags()
    {
        return $this->morphToMany(Tag::class, 'taggable');
    }
}

 

Tag Model:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Tag extends Model
{
    /**
     * Get all of the posts that are assigned this tag.
     */
    public function posts()
    {
        return $this->morphedByMany(Post::class, 'taggable');
    }

    /**
     * Get all of the videos that are assigned this tag.
     */
    public function videos()
    {
        return $this->morphedByMany(Video::class, 'taggable');
    }
}

 

 

Retrieve Records:

Once your database table and models are defined, you may access the relationships via your models. For example, to access all of the tags for a post, you may use the tags dynamic relationship property.

$post = Post::find(1);

foreach ($post->tags as $tag) {
    //
}

You may retrieve the parent of a polymorphic relation from the polymorphic child model by accessing the name of the method.

$tag = Tag::find(1);

foreach ($tag->posts as $post) {
    //
}

foreach ($tag->videos as $video) {
    //
}

 

Create Records:

Now, we will create records in the tag table. 

$post = Post::find(1);	
 
$tag = new Tag;
$tag->name = "Techsolutionstuff";
 
$post->tags()->save($tag);
 
$post = Post::find(1);	
 
$tag1 = Tag::find(1);
$tag2 = Tag::find(2);
 
$post->tags()->attach([$tag1->id, $tag2->id]);

 

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

 


You might also like:

RECOMMENDED POSTS

FEATURE POSTS