راکت

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

1 پاسخ

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

    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

ثبت پرسش جدید

پاسخ‌ها

1
محمدحسن یگانه
محمدحسن یگانه
@mhyeganeh

تخصص: Full-Stack Web Developer Freelancer

سلام
بنده تمام کدهاتون رو کامل نخوندم و نمیدونم جای دیگه ایش هم نیاز به اصلاح داره یا نه... ولی در یک نگاه کلی اوکی بود و باز هم اگر شک داشتید میتونید از مستندات خود لاراول برای این بحث استفاده کنید. (اتفاقا مثالی که خودش هم زده دقیقا بحث 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 ها استفاده می‌کنید خودش بصورت اتومات انجام میشه.

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

شاید پاسخ شما همین‌جا باشد

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

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