یک علاقه مند به برنامه نویسی https://masoudzarjani.ir/
روابط پلی مورفیک (چند ریختی یا چند دگردیسی) در لاراول
یک رابطه پلی مورفی اجازه می دهد تا مدل هدف به بیش از یک نوع مدل با استفاده از یک ارتباط واحد متصل شود.
یک به یک
ساختار جدول
یک رابطه پلی مورفیک شبیه به رابطه یک به یک ساده در روابط لاراول می باشد. با این حال می تواند یک مدل را به مدل های دیگر ربط دهد و متصل شود. به عنوان مثال در یک بلاگ، جدول پست و جدول کاربران می توانند به جدول عکس ها مرتبط شوند و دسترسی داشته باشند.یعنی می تواند یک تصویر را به یک پست و یا یک کاربر متصل نماییم. ابتدا ساختار جدول را بررسی می نماییم:
posts
id - integer
name - string
users
id - integer
name - string
images
id - integer
url - string
imageable_id - integer
imageable_type - string
به ستون های imageable_id و imageable_type در جدول تصاویر توجه نمایید. ستون imageable_id مقدار ID مربوط به پست یا کاربر را در بر می گیرد، در حالی که ستون imageable_type حاوی نام کلاس مدل والد (parent) است. ستون imageable_type توسط Eloquent مورد استفاده قرار می گیرد تا تعیین شود که کدام نوع از مدل والد در هنگام دسترسی به روابط تصویر بازگشت می کند.
ساختار مدل
حال بیایید تعاریف مربوط به مدل برای ساختن این رابطه را بررسی نماییم:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Image extends Model
{
/**
* Get all of the owning imageable models.
*/
public function imageable()
{
return $this->morphTo();
}
}
class Post extends Model
{
/**
* Get the post's image.
*/
public function image()
{
return $this->morphOne('App\Image', 'imageable');
}
}
class User extends Model
{
/**
* Get the user's image.
*/
public function image()
{
return $this->morphOne('App\Image', 'imageable');
}
}
بازیابی رابطه
هنگامی که جدول پایگاه داده ها و مدل های شما تعریف می شود، می توانید به روابط خود از طریق مدل های خود دسترسی پیدا کنید. به عنوان مثال، برای بازیابی تصویر برای یک پست، می توانیم از ویژگی های پویای تصویر استفاده کنیم:
$post = App\Post::find(1);
$image = $post->image;
برای دسترسی عکس عمل بالا یعنی بدست آوردن پست مربوط به عکس که با هم در رابطه می باشند از روش زیر استفاده می نماییم:
$image = App\Image::find(1);
$imageable = $image->imageable;
ارتباط یک به چند
ساختار جدول
با توجه به موارد بالا برای ارتباط یک به چند ابتدا از ساختار جدول زیر استفاده خواهیم کرد:
posts
id - integer
title - string
body - text
videos
id - integer
title - string
url - string
comments
id - integer
body - text
commentable_id - integer
commentable_type - string
ساختار مدل
مدل خود را نیز به صورت زیر ایجاد می نماییم:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
/**
* Get all of the owning commentable models.
*/
public function commentable()
{
return $this->morphTo();
}
}
class Post extends Model
{
/**
* Get all of the post's comments.
*/
public function comments()
{
return $this->morphMany('App\Comment', 'commentable');
}
}
class Video extends Model
{
/**
* Get all of the video's comments.
*/
public function comments()
{
return $this->morphMany('App\Comment', 'commentable');
}
}
بازیابی رابطه
به روش زیر نیز از رابطه برای بدست آوردن داده ها استفاده می نماییم:
$post = App\Post::find(1);
foreach ($post->comments as $comment) {
//
}
و برای بدست آوردن داده ها برعکس راه بالا یعنی رسیدن به پست های مربوط به نظرات از روش زیر پیروی می کنیم:
$comment = App\Comment::find(1);
$commentable = $comment->commentable;
امیدوارم آموزش به کار شما بیاید در پروژه های عظیم به شدت حجم کد نویسی را کم میکند و سرعت کد نویسی افزایش و کد های شما را بهینه تر می کند.
در مرحله بعد ذخیره سازی اطلاعات را با همین ارتباطات آموزش خواهم داد.
مطلبی دیگر از این انتشارات
تینکر در لاراول چیست؟! یک پکیج فوق العاده برای کار با تینکر?
مطلبی دیگر از این انتشارات
پکیج Laravel-attributes - ویژگی ها به صورت خیلی راحت در لاراول
مطلبی دیگر از این انتشارات
لاراول queue ، کاربر رو معطل نکن !