سلام دوستان تو جاهایی که ما یه رابطه پلی مورفیک داریم مثلا فرض کنید مثل سیستم کامنت که قراره تو جاهای مختلف استفاده بشه هم توی پست ها و هم توی محصولات یا توی وبسایت های اموزشی هم توی دوره ها هم توی ویدئو ها خب ما نمیدونیم این کامنتی که اومده برای کدوم مدله که بخوایم ایجادش کنیم برای اینجور مواقع باید چه کار کرد کسی به همچنین موردی برخورده یه راهنمایی کنی منو ؟
خیلی سرچ کردم فقط رسیدم به داینامیک مدل ها که اینجوریه که اسمو مدل رو توی فرم قرار میدیم ارسال میکنیم توی کنترلر نیم اسپس رو تولید میکنیم و از روس آبجکت میسازیم اما بنظرم راه خوبی نیومد راه بهتری کسی سراغ داره ؟
مثلا این یک راه بود با خط زیر nameSpace رو با فرم ارسال میکنیم
<input type="hidden" name="name_model" value="{{ get_class($post) }}" />
و بعد توی کنترلر باید به صورت زیر از مدل آبجککت بسازیم
$this->model = new $request()->name_model;
استفاده از get_class و نیماسپیس یک روش متعارف هست. میتونید توی مدل کامنت یه تابع تعریف کنید و اسم کلاس رو بهش پاس بدید تا اون تابع این عملیات رو انجام بده... اما در هر صورت در روابط پالی مورفیک شما به نوع داده (, taggable_Type ,commentable_Type , likable_Type) که ذخیره میشه حتما نیاز دارید.
@arshiya73arshiya
برای استفاده از روابط چند شکلی یا پلیمورفیک در لاراول باید مراحل زیر رو دنبال کنید.
در این مثال قابلیت تگ کردن رو در نظر میکیریم.
ساختار جدولهای دیتابیس:
courses
id - integer
name - string
articles
id - integer
name - string
tags
id - integer
name - string
taggables
tag_id - integer
taggable_id - integer
taggable_type - string
ساختار مدلها:
مدلهای Article و Course هر دو یک متد tags دارند که رابطه morphToMany رو از کلاس پایه الکوئنت فراخوانی میکنه
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
// Get all of the tags for the article.
public function tags()
{
return $this->morphToMany('App\Tag', 'taggable');
}
}
رابطه عکس در مدل Tag:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Tag extends Model
{
// Get all of the articles that are assigned this tag.
public function articles()
{
return $this->morphedByMany('App\Article', 'taggable');
}
// Get all of the courses that are assigned this tag.
public function courses()
{
return $this->morphedByMany('App\Course', 'taggable');
}
}
بازیابی رابطه:
$course = App\Course::find(1);
foreach ($course->tags as $tag) {
//
}
و
$tag = App\Tag::find(1);
foreach ($tag->articles as $article) {
//
}
همچنین میتونی پکیجهای زیر رو هم چک کنی. در ساختار کد اون ها هم همچین حالتی رعایت شده.
https://github.com/cybercog/laravel-likeable
https://github.com/faustbrian/Laravel-Commentable
ممنون از جوابتون و لینک هایی که ارسال کردید اما سوال من در مورد نوع استفاده از این روابط نبود ببینید توی رابطه بین همون تگ و مقاله ای که شما مثال زدید ، ما ابتدا مقاله رو ایجاد میکنیم و بعد از ایجاد اون حالا یه آبجکت از مقاله داریم و میایم میگیم این تگ ها رو به واسطه اون رابطه ای که دارن برای این مقاله سینک کن درسته ؟
اما توی قسمت کامنت یا لایک یا هرچیزی که به شکل این دو قراره پیاده سازی بشه ما زمان ایجاد یک مقاله نمیایم براش کامنت هم سینک کنیم که درسته ؟
ما با استفاده از متد show میایم سینگل اون مقالرو میگیریم و حالا با روش های مرسوم توی صفحه سینگل مربوطه نمایش میدیم تا اینجام که مشکلی نیست
حالا ما میخوایم یه کامنت برای این مقاله ایجاد کنیم ، که یه متن داره و یه آیدی که نشون دهنده این باشه که قراره برای کدوم پست باشه
اما این برای زمانی درسته که ما فقط بخوایم این سیستم رو برای فقط مقالاتمون استفاده کنیم اگه ما نیاز داشته باشیم هم برای محصولات هم برای بخش های دیگه استفاده کنیم توی کنترلر مربوط به ذخیره کامنت نیاز به آبجکت مربوطه هم داریم که موقع ذخیره مشخص کنیم این کامنت برای کدوم رکورد از کدوم مدل هست
من با سرچ کردن به روشی که در بالای صفحه نوشتم رسیدم اما فکر میکنم باید راه حل های دیگه ای هم داشته باشه که نیاز نباشه ما با تابع get_class نام مدل رو پاس بدیم به متدمون و اونجا حالا یا ازش آبجکت بسازیم یا همون namespace رو ذخیره کنیم توی جدول کامنتمون
استفاده از get_class و نیماسپیس یک روش متعارف هست. میتونید توی مدل کامنت یه تابع تعریف کنید و اسم کلاس رو بهش پاس بدید تا اون تابع این عملیات رو انجام بده... اما در هر صورت در روابط پالی مورفیک شما به نوع داده (, taggable_Type ,commentable_Type , likable_Type) که ذخیره میشه حتما نیاز دارید.
ممنون بابت راهنماییتون بله خودمم باز سرچ کردم و از هر روشی که سرچ کردم با به همین روش رسیدم شاید دلیلشو ندونم ولی خب مطمئنا روش خوب و درستیه که به جز این روش دیگه رو معرفی نکردن بازم ممنون لطف فراوان کردید
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟