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

ارتباط بین جداول پست و دسته بندی در لاراول 9

سلام، وقتتون بخیر
توی سایتم چند تا بخش دارم؛ بخش فیلم، بخش موزیک، بخش مطلب و ...
حالا به تبعیت از وردپرس اومدم و برای هر بخش یک دسته بندی جدا در نظر گرفتم(بخش مطالب دسته بندی های خودش، بخش موزیک دسته بندی خودش و ...).
الان من یک جدول posts دارم به این شکل که کد مایگریشن اون:

public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->string('slug')->unique();
            $table->longText('desc');
            $table->longText('content');
            $table->string('banner');
            $table->integer('views')->default('0');
            $table->timestamps();
        });
    }

یک جدول category_post دارم برای ذخیره دسته بندیهای مربوط به جدول posts یا همون مطالبم:

public function up()
    {
        Schema::create('category_posts', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('slug')->unique();

            $table->unsignedBigInteger('category_id')->nullable();
            $table->foreign('category_id')
                ->references('id')
                ->on('category_posts')
                ->onUpdate('CASCADE')
                ->onDelete('CASCADE');

            $table->timestamps();
        });
    }

تا اینجا که مشکلی نیست، میام دسته بندی ها رو ذخیره میکنم و تو صفحه افزودن مطلب میام نشونشون میدم که کاربر بتونه انتخاب کنه دسته بندی مورد نظرش رو، به این شکل:
![ تصویر][1]
[1]:
https://static.roocket.ir/images/editor/2022/12/2/1YA4He2xfmQioF299e0mE1aXOD7jnMUXMHCscTlv.png
حالا یه جدول دیگه میخوام درست کنم که توی این جدول post_id و category_id رو ذخیره کنم؛ الان هر چی تلاش میکنم و کدهای مختلف رو تست میکنم اصلا به نتیجه نمیرسم،
اومدم یک مایگریشن جدید ایجاد کردم به اسم category_posts_details که کدهای زیر رو داخلش قرار دادم:

public function up()
    {
        Schema::create('category_posts_details', function (Blueprint $table) {
            $table->id();
            $table->foreignId('category_id')
                ->constrained()
                ->onUpdate('CASCADE')
                ->onDelete('CASCADE');

            $table->foreignId('post_id')
                ->constrained()
                ->onUpdate('CASCADE')
                ->onDelete('CASCADE');

            $table->timestamps();
        });
    }

حالا موقع اجرا کردن مایگریشن خطای زیر رو میگیرم:

  SQLSTATE[HY000]: General error: 1005 Can't create table `kids`.`category_posts_details` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `category_posts_det
ails` add constraint `category_posts_details_category_id_foreign` foreign key (`category_id`) references `categories` (`id`) on delete CASCADE on update CASCADE)

نمیدونم اسم جدول رو دارم اشتباه وارد میکنم یا کلا کدهام اشتباهه ...
اینم کدهای فانکشن store کنترلر Post:

public function store(CreatePostRequest $request)
    {
        $file = $request->file('banner');
        $file_name = $file->getClientOriginalName();
        $file->storeAs('images/banners', $file_name, 'public_files');

        $data = $request->validated();
        $data['banner'] = $file_name;

        Post::create($data);
        session()->flash('status', 'مطلب جدید ایجاد شد');
        return redirect()->route('posts.index');
    }

ممنون میشم یه راهنمایی کنید
با تشکر


ثبت پرسش جدید
سینا خاقانی
تخصص : توسعه دهنده بک‌اند
@sina.it91 2 سال پیش مطرح شد
0

@tamiratsg
سلام
وارد پوشه config شوید و فایل database.php رو باز کنید و مقدار engine در mysql رو برابر با InnoDB قرار بدین
این مقدار به صورت پیشفرض myISAM است که از کلیدهای خارجی پشتیبانی نمی‌کند.

مانند تصویر


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

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