وابستگیهای چند ریختی( Polymorphic Relation ) در سیستمهای ORM نوعی از ارتباط میان دو جدول هستند که تعداد نامحدودی از ردیفهای جدول دوم به تعداد نامحدودی از ردیفهای جدول اول مرتبط میشوند.
برای مثال تعداد نامحدودی از دانشآموزان هر یک میتوانند در تعداد نامحدودی از کلاسها ثبت نام کنند.
نگهداری ارتباط میان این دو جدول در ساختار پایگاه داده رابطهای( Relational Database ) در یک جدول واسط امکانپذیر است.
در لاراول این ارتباط با استفاده از دستور belongsToMany ایجاد و مورد استفاده قرار میگیرد.
برای مثال تعریف دسترسی به دانشآموزانی که در یک کلاس ثبت نام کردهاند به شکل زیر در مدل کدنویسی میشود:
public function Users() { return $this->belongsToMany( 'User', 'user_lessons', 'lesson_id', 'user_id' ); }
در هنگام استفاده از کد بالا، لازم است که یک جدول واسط با نام user_lessons حاوی دو فیلد lesson_id و user_id تعریف کنیم.
لاراول به صورت پیشفرض، تنها فیلدهای شناسه، و این دو فیلد را مقداردهی میکند و فیلدهای اضافی مانند فیلد تاریخ در این جدول پر نمیشوند.
برای دانستن زمان ثبت نام هر کاربر در هر کلاس، لاراول این امکان را به ما میدهد که با تغییراتی در مدل، تاریخ ایجاد و آخرین بهروزرسانی را نیز در این جدول ثبت کنیم:
public function Users() { return $this->belongsToMany( 'User', 'user_lessons', 'lesson_id', 'user_id' )->withTimestamps(); }
اضافه شدن دستور withTimestamps به انتهای belongsToMany به لاراول میگوید که در هنگام ایجاد ارتباط، تاریخهای ثبت و به روزرسانی را نیز مانند سایر جدولها به این ارتباط پیوست کند.
استفاده از فیلدهای تاریخ در هنگام خواندن مقادیر
فیلدهای تاریخ ذخیره شده در این جدول واسط در هنگام مرتبسازی و خواندن اطلاعات به صورت زیر در دسترس خواهند بود:
$users = $class->Users()->latest( 'pivot_created_at' )->get();
در کد بالا، ثبت صریح نام فیلد created_at با پیشوند pivot الزامی است. در صوت ننوشتن نام این فیلد یا پیشوند نکردن آن با pivot، اگر جدول کاربران حاوی فیلدی با نام created_at باشد، مشکلاتی از جمله تداخل و خطای نحوی پایگاه داده ایجاد خواهد شد.