روابط پلی مورفیک (چند ریختی یا چند دگردیسی) در لاراول

یک رابطه پلی مورفی اجازه می دهد تا مدل هدف به بیش از یک نوع مدل با استفاده از یک ارتباط واحد متصل شود.

یک به یک

ساختار جدول

یک رابطه پلی مورفیک شبیه به رابطه یک به یک ساده در روابط لاراول می باشد. با این حال می تواند یک مدل را به مدل های دیگر ربط دهد و متصل شود. به عنوان مثال در یک بلاگ، جدول پست و جدول کاربران می توانند به جدول عکس ها مرتبط شوند و دسترسی داشته باشند.یعنی می تواند یک تصویر را به یک پست و یا یک کاربر متصل نماییم. ابتدا ساختار جدول را بررسی می نماییم:

  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;

امیدوارم آموزش به کار شما بیاید در پروژه های عظیم به شدت حجم کد نویسی را کم میکند و سرعت کد نویسی افزایش و کد های شما را بهینه تر می کند.

در مرحله بعد ذخیره سازی اطلاعات را با همین ارتباطات آموزش خواهم داد.