Many To Many Polymorphic Relationship In Laravel 9

In this article, we will see many to many polymorphic relationship in laravel 9. many to many polymorphic relationship are more complicated compared to morph one and morph many relationships. To access many to many polymorphic relationship use morphToMany() and morphedByMany(). many to many polymorphic relationship can use in laravel 6, laravel 7, and laravel 8.

So, let's see laravel 9 many to many polymorphic, polymorphic relationship in laravel 9 example, morphToMany in laravel 9, morphedByMany in laravel 9.

In this example, we will create migration for the post, taggables, and videos and also create model Post, Taggable, and Video.

many_to_many_polymorphic_relationship_laravel_9_example

 

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 the relationship of both models.

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 a record in the post table. 

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

In this example, we will attach a tag to the post.

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

In this example, we will sync a tag with the post.

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

 


You might also like:

techsolutionstuff

Techsolutionstuff | The Complete Guide

I'm a software engineer and the founder of techsolutionstuff.com. Hailing from India, I craft articles, tutorials, tricks, and tips to aid developers. Explore Laravel, PHP, MySQL, jQuery, Bootstrap, Node.js, Vue.js, and AngularJS in our tech stack.

RECOMMENDED POSTS

FEATURE POSTS