ایجاد اکسترافیلد در لاراول


بنا به درخواست بسیار مهمی که از من شد ، تصمیم گرفتم اکسترافیلد ها رو در لاراول توضیح بدم .

اول از همه ببینیم که

اکسترافیلد چیست ؟

اتفاق افتاده که شما داخل یک سایت مثل آمازون ( نسخه ایرانیشم هست و ادعا میکنن استارت آپه ) دارید خرید میکنید و کالای خودتون رو پیدا کردید . حالا میخواین ببینید مشخصات کالا چیه . اون پایین یه تب هست به اسم مشخصات فنی ، به همین میگیم اکسترافیلد . و السلام .

ساختار کلی اکسترافیلدها :

اکسترافیلد یک ساختار کلی داره و بهتره این شکلی رعایت بشه :

1- هر دسته بندی دارای یک سری اسکترافیلد هست . چرا؟

فرض کنید من دسته بندی لوازم خانگی دارم و داخل اون دسته بندی جارو برقی . حالا مشخصات کلی همه جارو برقی ها در یک گروه قرار میگیرند . هیچ جارو برقی نداریم که هارد اکسترنال داشته باشه . پس هر دسته بندی باید یک گروه اکسترا فیلد داشته باشه . پس یک جدول میخوام برای ارتباط اکسترافیلد به گروه.

2- هر اکسترافیلد باید مقدار مرتبط با آی دی خودش رو بگیره .

من میام داخل دسته بندی جارو برقی ، یک گروه اکسترافیلد ایجاد میکنم که مسلما آی دی خاص خودشون رو دارن و تکراری هم نیست . زمانی که کالای خودم رو وارد میکنم ، متناسب با آی دی کالای خودم ، به آی دی های اکسترافیلد ، مقدار میدم . پس یک جدول میخوام برای ارتباط کالا به اکسترافیلد .

3 - مسلما ما باید یک رابطه بین کالا و دسته بندی هم داشته باشیم . پس یک دیتابیس هم برای این کالا و دسته بندی ایجاد میکنیم .


به طور کلی الان ما جداول زیر رو داریم :

products , categories , extrafields , extrafield_values

جدول کالا و دسته بندی رو فرض میکنم که به طور مناسب طراحی کردید . و داخل کالا یک ستون برای دسته بندی درست کردین .

باید ساختار اکسترافیلد رو درست کنیم .

خروجی جدول extrafields :

+------------+------------------+------+-----+---------+----------------+

|id|int(10)unsigned|NO|PRI|NULL|auto_increment|

|name|varchar(191)|NO||NULL||

|c_id|int(11)|NO||NULL||

|created_at|timestamp|YES||NULL||

|updated_at|timestamp|YES||NULL||

+------------+------------------+------+-----+---------+----------------+


و خروجی جدول extrafields_value

+------------+------------------+------+-----+---------+----------------+

|Field|Type|Null|Key|Default|Extra|

|id|int(10)unsigned|NO|PRI|NULL|auto_increment|

|e_id|varchar(191)|NO||NULL||

|value|int(11)|NO||NULL||

|p_id|int(11)|NO||NULL||

|created_at|timestamp|YES||NULL||

|updated_at|timestamp|YES||NULL||

+------------+------------------+------+-----+---------+----------------+


مرحله ای که من میخوام در موردش صحبت کنم نحوه نوشتن Model برای گرفتن اطلاعات اکسترافیلده .

من توی کنترلر دریافت یک کالای خاص میام و اینجوری مینویسم :

$getExtrafields=$this->extrfafieldsValues->where(['p_id'=>$id])->get();

$this->extrfafieldsValues میشه مدل مربوط به مقادیر اکستارفیلد که داخل construct نوشتم .

اول از همه ما باید کل اکسترافیلدهای مربوط به کالا رو بگیریم . ما الان مقادیر هر اکسترافیلد رو داریم . وقتشه که بریم توی Blade . اونجا باید اسم هر اکسترافیلد هم بگیریم .

مثلا چیزی که الان ما داریم به این صورته که برای یک تلویزیون مقادیر زیر اومده :‌

p_id = 1 , value = 43" , e_id = 1

p_id = 1 , value = مشکی , e_id= 2

خوب معلومه که مقدار هر اکسترافیلد چیه . اما e_id که برابر 1 هست رو نمیدونم اسمش چیه . حدس میزنیم با توجه به مقدارش ، سایز صفحه نمایشه . اما باید به کاربر نمایش بدیم . پس میریم توی blade و قسمتی که foreach میزنیم تا تمام مقادیر رو نمایش بدیم .

@foreach($extrafieldsas as $item)
<div class="col">
{{$item->getName->name}}
</div>
<div class="col">
{{$item->value}}
</div>
@endforeach

حالا داخل این قسمت باید تابع getName رو داخل مدل extrafield_value به این شکل بسازم و تمام .

publicfunctiongetName(){return$this->belongsTo('App\ExtraFields','id','e_id');}

publicfunctiongetName(){return$this->belongsTo('App\ExtraFields','id','e_id');}


Laravel BelongsTo


اگر خوب بود یک فنجون قهوه مهمونم کنین . حرف زیاده برای گفتن