۱۳۹۴ آذر ۲۴, سه‌شنبه

استفاده از رابطه Polymorphic در لاراول 5.1

مقدمه :
گاها به نظر میاد استفاده از فریمورک ها خلاقیت رو ازما خواهد گرفت و ما رو به یک کد زن تنبل ومصرفی تبدیل خواهد کرد.

در خیلی موارد فریمورک ها این مورد رو نادیده میگیرند. اما به نظر میاد لاراول با به روز رسانی های خودش این موارد رو نیز مد نظر قرار میده مثل حذف کردن فرم از روی فریم ورک 

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

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

که البته به دو صورت تکی و چند گانه در راهنمای اصلی لاراول معرفی شده است


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

به این صورت که یک جدول photos خواهید داشت و در این جدول مسیر تصویر را ذخیره میکنید و اینکه به کدام محصول یا کارمند مربوط میشه به صورت اتوماتیک ذخیره خواهد شد 
نحوه نوشتن متد مرتبط در داخل مدل تو خود راهنما نوشته شده و نیز نحوه گرفتن  مقادیر اما آنچه که دیده نمیشه و اکثر سوالات راجع به این مورد هست چگونگی ذخیره با استفاده از پلی مورفیک هست 

ببینید چند روش برای وارد کردن مقدار به یک جدول دیتابیس وجود داره از جمله
create , save , savemany , attach, associate , sync 

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

حتما در راهنما موارد mass assign و اپدیت رو مطالعه کنید و موارد لازم رو در مدل خودتون درج کنید 

یک روشی که میشه برای همین مثال در مورد insert با استفاده از polymorphic استفاده کرد create هست 

به این صورت که ابتدا fillable ها رو توی مدل تعریف میکنیم 

بعد میام سراغ نوشتن دستورات ذخیره سازی

قرار هست که یک محصولی ایجاد کنیم و برای اون عکسی در نظر بگیرم

یک فرمی برای درج مشخصات محصول و همچنین آپلود تصویر ایجاد میکنم و بعد از سابمیت کردن فرم این اتفاق باید در کنترلر بیفته
1- دریافت مقادیر معتبر ارسالی توسط فرم
2- درج مشخصات محصول در دیتابیس
3- درج تصویر در دیتابیس 
4- اعلام ارتباط بین محصول و تصویر

حالا اینجا رو شما چطور میخوای انجام بدی چه مشخصاتی ذخیره کنی من کاری ندارم

$product = Product::create($input);
این کد برای ذخیره کردن محصول با استفاده از مدل product می باشد که متغیر $input در واقع به صورت object آبجکتیو مشخصات مقادیر ارسالی از فرم رو تو خودش داره حالا شما هر اسمی میخوای بزار و با هر روشی خواستی این مقادیر رو میتونید ذخیره کنی

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

برای شناسوندن تصویر ممکنه شما یک متغیر دیگه تعریف کنید مثال $photo یا اصلا از خود $input استفاده کنید

اینجاست که بستگی به نحوه عملکرد شما داره که آیا مدل و یا نام فیلد ها ستون ها و جدول رو چگونه انتخاب کرده اید 
چون اگر قرار باشه به صورت خودکار این اعمال انجام بشه نیاز هست که این نام گذاری ها به درستی و با روشی که لاراول معرفی کرده انجام گرفته شده باشه

چون اینجا از پلی مورفیک تکی استفاده شده من همزمان مرحله 3 و 4 رو انجام میدم به این صورت 
در بالا مجصول رو ایجاد کردیم مینویسیسم 
$product اگر بعد از ایجاد از این متغیر استفاده کنیم دیگه نیازی به این نداریم که تعریف کنیم کدام محصول
یعنی اگر بنویسیم 

$product = Product::create($input) 
و بعدش با $product هر متدی را اجرا کنیم در واقع به محصول ایجاد شده اشاره کرده ایم
در مدل راهنما برای این رابطه از نام imageable استفاده شده پس بعد از دستور بالا مینویسیم 
$product->imagable()
و با این کار به رابطه پلی مورفیک اشاره میکنیم اما بعد از این دستور باید اتفاقی که میخواهیم با استفاده از این دستور بیفتد را بنویسیم
یعنی مثلا میخواهیم تصویریبا مشخصات فرم ارسالی ایجاد شده و با محصول ایجادی ما مرتبط باشد پس مینویسیم
$product->imagable()->create($input);
در این create اگر متغیر input موارد مورد نیاز برای ایجاد یک تصویر را داشته باشد ایجاد شده و مقادیر 
imagable_id , imagable_type به صورت خودکار مقدار دهی خواهند شد 
به این صورت که type به مدل مربوطه که اینجا product هست و id نشان دهنده این است که کدامین مورد در مدل product هست
مثلا محصول شماره 8 

ممکنه به جای input در مرحله آخر از متغیر دیگه ای استفاده کنید دقت کنید که باید آبجکتیو باشد یعنی مثلا 
$photo['photo_path'] = 'images/file1.jpg';
$photo['photo_name'] = 'file name';
کلید ها باید با نام ستون ها یکی باشه تا بتونه تشخیص بده

حالا با توجه به مواردی که در مقدمه گفتم این یک روش عادی و روتین هست حتما شرط و قراری نیست که به این شکل استفاده بشه ممکنه شما بخواید با یک روش دیگه این اعمال رو انجام بدید 
راهنمای اشاره شده در متن : http://laravel.com/docs/5.1/eloquent-relationships#polymorphic-relations

با تشکر


هیچ نظری موجود نیست:

ارسال یک نظر