سلام من طبق یه آموزشی یه تیبل برای رول ساختم بعد که بعد میاد این رو با تیبل کاربر ها و یه تیبل که کاربر ها رو به رول ها ارتباط میده رابطه مستقیم ایجاد میکنه.
الان من سه تا تیبل دارم
users
roles
role_user
تیبل یوز که همون معمولی ماله خوده لاراوله
اما این مایگریشن برای roles
Schema::create('roles', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
x$table->timestamps();
});
این هم مایگریشن مربوط به یوزر رول
Schema::create('role_user', function (Blueprint $table) {
$table->integer('role_id')->unsigned();
$table->integer('user_id')->unsigned();
$table->foreign('role_id')->references('id')->on('roles')->onCascade('delete');
$table->foreign('user_id')->references('id')->on('users')->onCascade('delete');
});
مشکل اینجاست که وقتی مایگریت میکنم خطای زیر رو میده
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `role_user` add constraint `role_user_user_id_foreign` foreign key (`user_id`) references `users` (`id`))
Schema::create('roles', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
x$table->timestamps();
});
Schema::create('role_user', function (Blueprint $table) {
$table->unsignedBigInteger('role_id');
$table->unsignedBigInteger('user_id');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade')->onUpdate('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
});
به این شکل نباید مشکلی باشه، و همچنین دو مایگریت یوزر و رول باید بالاتر از مایگریت رول-یوزر باشن، تا خطایی رخ نده،
این موارد رو بررسی کنید
به جای
Integer
از unsignedBigInteger
استفاده کنید
$table->unsignedBigInteger('user_id')->unsigned();
@amirsharifi سلام.
همونطوری که دوستمون @coaradsupp گفتن باید فیلد کلید خارجی از نوع bigInteger تعریف کنید . فقط خواستم دلیلشو براتون توضیح بدم که دلیل اصلیشو بدونید.
اگر اشتباه نکنم توی ورژن های 5.8 به بالای لاراول اومدن و مقدار دیفالت ستون id رو از integer معمولی به BigInteger تغییر دادن .یعنی این قسمت :
$table->increments('id');
برای شما یه فیلد id توی دیتابیس ایجاد میکنه که نوعش BigInt هست و موقع تعریف کلید خارجی قانونش این هست که تایپ کلید خارجیتون باید با تایپ رفرنسش برابر باشه و چون شما کلیدتون رو integer تعریف کردین تداخل ایجاد میشه .
کد صحیح :
Schema::create('role_user', function (Blueprint $table) {
$table->bigInteger('role_id')->unsigned();
$table->bigInteger('user_id')->unsigned();
$table->foreign('role_id')->references('id')->on('roles')->onCascade('delete');
$table->foreign('user_id')->references('id')->on('users')->onCascade('delete');
});
موفق باشید
خیلی ممنون از هردوی شما دوست عزیز اما نه unsignedBigInteger و نه bigInteger خطای من رو بر طرف نکرد تا جایی که من متوجه شدم اگه id رو برای تیبل اول یعنی roles از
$table->increments('id');
به
$table->id();
تغییر بدم که دقیقا میشه مثله آی دی تیبل یوزر ها خطا بر طرف میشه.
اما چرا؟؟؟
@amirsharifi یه مشکل جالبی که پیش اومد اینه :
توی کلید خارجیتون اصلا اون متد onCascade فک کنم وجود نداشته باشه و برعکس نوشتین من دقت نکردم قاعدتا باید onDelete رو cascade قرار بدین . 🧐
و اینکه الان که دقیقتر چک کردم :
$table->increments('id'); // creates integer column
$table->id(); // creates bigInteger column called id
در واقع اگر هر دو جدول roles و users رو آیدی هاشون رو بصورتی که خودتون تعریف کرده بودین increments بذارید باید با همون کد اولیتون کار کنه یعنی به این صورت :
Schema::create('role_user', function (Blueprint $table) {
$table->integer('role_id')->unsigned();
$table->integer('user_id')->unsigned();
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
فقط مطمین باشید که جای متد onDelete اشتباها onCascade ننویسید . و لطفا بعد از تست اگر امکانش هست نتیجشو اعلام کنید چون خیلی چالش قشنگی شد 😁
@SobhanDadkhah
مرسی از وقتی ک میزارید .
این بخش onDelete رو درست گفتین مدرس اشتباه گفته بود.
خدمتتون بگم که متاسفانه بازم نشد اما بررسی من نشون میده که خطا مربوط به همین دو خط هست
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
Schema::create('roles', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
x$table->timestamps();
});
Schema::create('role_user', function (Blueprint $table) {
$table->unsignedBigInteger('role_id');
$table->unsignedBigInteger('user_id');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade')->onUpdate('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->onUpdate('cascade');
});
به این شکل نباید مشکلی باشه، و همچنین دو مایگریت یوزر و رول باید بالاتر از مایگریت رول-یوزر باشن، تا خطایی رخ نده،
این موارد رو بررسی کنید
@amirsharifi سلام مجدد . نظر دوستمون @coaradsupp هم کاملا درسته احتمالا مشکل از این قسمته . در واقع باید ترتیب مایگریشن ها جوری باشه که با دستورتون ابتدا جداول یوزر ها و رول ها ایجاد بشن و بعد جدول pivot
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟