mehrdad70
3 سال پیش توسط mehrdad70 مطرح شد
1 پاسخ

ایجاد تگ با استفاده از polymorphic many to many

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

    public function up()
    {
        Schema::create('tags', function (Blueprint $table) {
            $table->id();
            $table->string('tag_name');
            $table->timestamps();
        });

        Schema::create('taggables', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('tag_id');

            $table->unsignedBigInteger('taggable_id');
            $table->unsignedBigInteger('taggable_type');

            $table->foreign('tag_id')->references('id')->on('tags')->onDelete('CASCADE');
            $table->timestamps();
        });
    }

اینم روابط هست

class Tag extends Model
{
    protected $fillable = ['tag_name' , 'tag_id' , 'taggable_id' , 'taggable_type'];

    public function articles()
    {
        return $this->morphedByMany(Article::class , 'taggable');
    }
    public function products()
    {
        return $this->morphedByMany(Product::class , 'taggable');
    }
}
    public function tags()
    {
        return $this->morphToMany(Tag::class , 'taggable');    
    }

توی فرم create مقالاتم یه اینپوت برای تایپ تگ هی مدنظرم گذاشتم به این صورت
توضیح تصویر رو وارد کنید

الان موقعی که مقاله ذخیره میشه توی ذخیره سازی تگ ها مشکل دارم ممنون میشم کمک کنید بهم اینم کدهای بخش استور و ویو

    public function store(ArticleRequest $request , ArticleRepository $articleRepository)
    {
        $this->authorize('create' , Article::class);
        if ($request->hasFile('image')) {
            $imagePath = $request->file('image');
            $imageName = $imagePath->getClientOriginalName();
            $dir = 'articles';
            $path = $imagePath->storeAs($dir, $imageName, 'public');
        }

        $article = Article::create([
            'title' => $request->title,
            'slug' => $request->slug,
            'body' => $request->body,
            'user_id' => auth()->id(),
            'image' => $path
        ]);

        $article->categories()->sync($request->categories);

        $article->comments()->create([
            'body' => $request->body,
            'user_id' => auth()->id(),
            'parent_id' => $request->parent_id
        ]);

        $article->tags()->create([
            'tag_name' => $request->tag_name,
            'taggable_id' => $article->id,
            'taggable_type' => get_class($article),
        ]);

        return redirect(route('articles.index'));
    }
                            <div class="control-group form-group">
                                <label class="form-label"> برچسپ ها </label>
                                <input name="tag_name[]" id="tagSelect" multiple  class="form-control" value="{{old('tag_ids')}}" >
                            </div>

@ali.bayat
@hesammousavi
@mhyeganeh
@SobhanDadkhah


ثبت پرسش جدید
محمدحسن یگانه
تخصص : Full-Stack Web Developer Freel...
@mhyeganeh 3 سال پیش آپدیت شد
0

سلام
بنده تمام کدهاتون رو کامل نخوندم و نمیدونم جای دیگه ایش هم نیاز به اصلاح داره یا نه... ولی در یک نگاه کلی اوکی بود و باز هم اگر شک داشتید میتونید از مستندات خود لاراول برای این بحث استفاده کنید. (اتفاقا مثالی که خودش هم زده دقیقا بحث tag هاست):

https://laravel.com/docs/8.x/eloquent-relationships#many-to-many-polymorphic-relationshttps://laravel.com/docs/8.x/eloquent-relationships#many-to-many-polymorphic-relations

اما یک موردی که به چشمم میاد این بخش هست:

$article->tags()->create([
            'tag_name' => $request->tag_name,
            'taggable_id' => $article->id,
            'taggable_type' => get_class($article),
]);

اینکه تا جایی که می‌دونم شما نباید (یا نیازی نیست) خودتون taggable_type و taggable_id رو بهش بدید. بلکه این کار وقتی دارید از Eloquent Relation ها استفاده می‌کنید خودش بصورت اتومات انجام میشه.

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


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام