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

یک رابطه پلی مورفی اجازه می دهد تا مدل هدف به بیش از یک نوع مدل با استفاده از یک ارتباط واحد متصل شود.یک به یکساختار جدولیک رابطه پلی مورفیک شبیه به رابطه یک به یک ساده در روابط لاراول می باشد. با این حال می تواند یک مدل را به مدل های دیگر ربط دهد و متصل شود. به عنوان مثال در یک بلاگ، جدول پست و جدول کاربران می توانند به جدول عکس ها مرتبط شوند و دسترسی داشته باشند.یعنی می تواند یک تصویر را به یک پست و یا یک کاربر متصل نماییم. ابتدا ساختار جدول را بررسی می نماییم: 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; امیدوارم آموزش به کار شما بیاید در پروژه های عظیم به شدت حجم کد نویسی را کم میکند و سرعت کد نویسی افزایش و کد های شما را بهینه تر می کند.در مرحله بعد ذخیره سازی اطلاعات را با همین ارتباطات آموزش خواهم داد.