سوال در مورد مبحث داینامیک مدل ها در لاراول

- 5 روز پیش
توسط علی بیات آپدیت شد
arshiya saeidi ( 4434 تجربه )
1 هفته پیش

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

خیلی سرچ کردم فقط رسیدم به داینامیک مدل ها که اینجوریه که اسمو مدل رو توی فرم قرار میدیم ارسال میکنیم توی کنترلر نیم اسپس رو تولید میکنیم و از روس آبجکت میسازیم اما بنظرم راه خوبی نیومد راه بهتری کسی سراغ داره ؟

مثلا این یک راه بود با خط زیر nameSpace رو با فرم ارسال میکنیم

<input type="hidden" name="name_model" value="{{ get_class($post) }}" />

و بعد توی کنترلر باید به صورت زیر از مدل آبجککت بسازیم

$this->model = new $request()->name_model;
بهترین پاسخ انتخاب شده توسط arshiya saeidi
علی بیات
5 روز پیش

استفاده از get_class و نیم‌اسپیس یک روش متعارف هست. میتونید توی مدل کامنت یه تابع تعریف کنید و اسم کلاس رو بهش پاس بدید تا اون تابع این عملیات رو انجام بده... اما در هر صورت در روابط پالی مورفیک شما به نوع داده (, taggable_Type ,commentable_Type , likable_Type) که ذخیره میشه حتما نیاز دارید.

arshiya saeidi ( 4434 تجربه )
1 هفته پیش

@ali.bayat

ممنون میشم اگه راهنماییم کنید

علی بیات ( 75297 تجربه )
6 روز پیش

@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) {
    //
}
علی بیات ( 75297 تجربه )
6 روز پیش

همچنین می‌تونی پکیج‌های زیر رو هم چک کنی. در ساختار کد اون ها هم همچین حالتی رعایت شده.

https://github.com/cybercog/laravel-likeable
https://github.com/faustbrian/Laravel-Commentable

arshiya saeidi ( 4434 تجربه )
5 روز پیش

@ali.bayat

ممنون از جوابتون و لینک هایی که ارسال کردید اما سوال من در مورد نوع استفاده از این روابط نبود ببینید توی رابطه بین همون تگ و مقاله ای که شما مثال زدید ، ما ابتدا مقاله رو ایجاد میکنیم و بعد از ایجاد اون حالا یه آبجکت از مقاله داریم و میایم میگیم این تگ ها رو به واسطه اون رابطه ای که دارن برای این مقاله سینک کن درسته ؟

اما توی قسمت کامنت یا لایک یا هرچیزی که به شکل این دو قراره پیاده سازی بشه ما زمان ایجاد یک مقاله نمیایم براش کامنت هم سینک کنیم که درسته ؟

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

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

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

علی بیات ( 75297 تجربه )
5 روز پیش

استفاده از get_class و نیم‌اسپیس یک روش متعارف هست. میتونید توی مدل کامنت یه تابع تعریف کنید و اسم کلاس رو بهش پاس بدید تا اون تابع این عملیات رو انجام بده... اما در هر صورت در روابط پالی مورفیک شما به نوع داده (, taggable_Type ,commentable_Type , likable_Type) که ذخیره میشه حتما نیاز دارید.

arshiya saeidi ( 4434 تجربه )
5 روز پیش

@ali.bayat

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

علی بیات ( 75297 تجربه )
5 روز پیش

@arshiya73arshiya
خواهش می‌کنم، موفق باشید.

برای ارسال پاسخ باید وارد سایت شوید