In this tutorial we will see laravel 8 many to many polymorphic relationship. many to many polymorphic relationship more complicated compare to morph one and morph many relationship.
many to many polymorphic relationship can use in laravel 6, laravel 7 and laravel 8 and for access many to many polymorphic relationship use morphToMany() and morphedByMany().
In this example we will create migration for post, taggables and videos and also create model Post, Taggable and Video. Also see create records, retrive records and attach records.
Now we will create migration for posts, tags, videos and taggable table.
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");
});
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');
}
}
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) {
//
}
$post = Post::find(1);
$tag = new Tag;
$tag->name = "websolutionstuff";
$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 :
In this article, we will see how to image upload in CKEditor with laravel 10. Here, we will learn about image uploa...
May-08-2023
In this article, we will see laravel 9 create middleware for XSS protection. Cross-site scripting is a type of...
Apr-30-2022
In this article, we will see laravel 9 user roles and permissions without package. Roles and permissions are an imp...
Apr-14-2022
In this article, we will see skype screen sharing is not working in ubuntu 22.04. When you install skype in ubuntu...
Feb-15-2023