سلام @hesammousavi
اررور زیر رو می گیرم وقتی می خوام جداول زیر رو درست کنم
roles , permissions و جدول میانی permission_role و جدول میانی role_user
ارور:
(errno: ۱۵۰ "Foreign key constraint is incorrectly formed") (SQL: alter table `permission_role` add constraint `permission_role_permission_id_foreign` foreign key (`permission_id`) references `permissions` (`id`) on delete cascade)
کد مایگریشن من:
public function up()
{
Schema::create('roles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('label')->nullable();
$table->timestamps();
});
Schema::create('permissions', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('label')->nullable();
$table->timestamps();
});
Schema::create('permission_role', function (Blueprint $table) {
$table->integer('permission_id')->unsigned();
$table->integer('role_id')->unsigned();
$table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->primary(['permission_id','role_id']);
});
Schema::create('role_user', function (Blueprint $table) {
$table->unsignedInteger('role_id');
$table->unsignedInteger('user_id');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->primary(['role_id','user_id']);
});
}
@sinakhoshdel
از این کد استفاده کنید
Schema::create('roles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('label')->nullable();
$table->timestamps();
});
Schema::create('permessions', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('label')->nullable();
$table->timestamps();
});
Schema::create('permession_role', function (Blueprint $table) {
$table->bigInteger('permession_id')->unsigned();
$table->bigInteger('role_id')->unsigned();
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->foreign('permession_id')->references('id')->on('permessions')->onDelete('cascade');
$table->primary(['role_id', 'permession_id']);
});
Schema::create('role_user', function (Blueprint $table) {
$table->bigInteger('user_id')->unsigned();
$table->bigInteger('role_id')->unsigned();
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->primary(['role_id', 'user_id']);
});
سلام به این دلیل این مشکل به وجود اومده که شما از bigIncrements استفاده کردی برای id ها و خواستی یک integer رو به یک bigInteger وصل کنی که نمیشه ستون هایی که کلیدی خارجی هستند رو به این صورت تعریف کن
$table->unsignedBigInteger('role_id');
یا میتونی bigInteger
اشون کنی و بعد اتریبیوت usigned()
رو بهشون بدی
@mahdimehrabi17 سلام ممنون از جوابت این کارو کردم هم با unsignedInteger ,و هم با bigInteger اما هنوز همون ارور رو میگیرم
F:\xampp\htdocs\awesome>php artisan migrate
Migrating: 2019_06_23_013909_create_roles_table
Illuminate\Database\QueryException : SQLSTATE[HY000]: General error: 1005 Can't create table `awesome`.`#sql-670_1e3` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `permission_role` add constraint `permission_role_permission_id_foreign` foreign key (`permission_id`) references `permissions` (`id`) on delete cascade)
at F:\xampp\htdocs\awesome\vendor\laravel\framework\src\Illuminate\Database\Connection.php:664
660| // If an exception occurs when attempting to run a query, we'll format the error
661| // message to include the bindings with SQL, which will make this exception a
662| // lot more helpful to the developer instead of just the database's errors.
663| catch (Exception $e) {
> 664| throw new QueryException(
665| $query, $this->prepareBindings($bindings), $e
666| );
667| }
668|
Exception trace:
1 PDOException::("SQLSTATE[HY000]: General error: 1005 Can't create table `awesome`.`#sql-670_1e3` (errno: 150 "Foreign key constraint is incorrectly formed")")
F:\xampp\htdocs\awesome\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458
2 PDOStatement::execute()
F:\xampp\htdocs\awesome\vendor\laravel\framework\src\Illuminate\Database\Connection.php:458
Please use the argument -v to see more details.
سلام استاد موسوی
@hesammousavi
نه اسم دیتابیس من awesome هستش
مشکل در ساخت جداول میانی هست
من دقیقا همون کارایی که شما در قسمت اول ACL دوره لاراول انجام دادینو کردم
خیلی سرچ کردم اما چیزی پیدا نشد
من از لاراول ۵.۸ استفاده میکنم
@hesammousavi من از آخرین ورژن زمپ استفاده میکنم
Apache 2.4.39,
MariaDB 10.3.16,
PHP 7.3.6,
phpMyAdmin 4.9.0.1,
OpenSSL 1.1.1,
XAMPP Control Panel 3.2.4,
Webalizer 2.23-04,
Mercury Mail Transport System 4.63,
FileZilla FTP Server 0.9.41,
Tomcat 7.0.92 (with mod_proxy_ajp as connector),
Strawberry Perl 5.16.3.1 Portable
این خط از permission_role رو بردارید و دوباره تست کنید
$table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');
ببینید ایا کلید role_id هم ارور میده
ارور مربوطه شما مربوط به لینک زیر میشه که محتواش در لاراول هم هست
https://laravel.com/docs/5.8/migrations#foreign-key-constraints
@sinakhoshdel
از این کد استفاده کنید
Schema::create('roles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('label')->nullable();
$table->timestamps();
});
Schema::create('permessions', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('label')->nullable();
$table->timestamps();
});
Schema::create('permession_role', function (Blueprint $table) {
$table->bigInteger('permession_id')->unsigned();
$table->bigInteger('role_id')->unsigned();
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->foreign('permession_id')->references('id')->on('permessions')->onDelete('cascade');
$table->primary(['role_id', 'permession_id']);
});
Schema::create('role_user', function (Blueprint $table) {
$table->bigInteger('user_id')->unsigned();
$table->bigInteger('role_id')->unsigned();
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->primary(['role_id', 'user_id']);
});
طبق توضیحات گفته شده که به جای کد زیر
$table->integer('permission_id')->unsigned();
باید اینطوری بنویسید
$table->unsignedBigInteger('permission_id');
$table->unsignedBigInteger('role_id');
البته با کد زیر هم میتونید اطمینان حاصل کنید که foreign key constraints فعاله
Schema::enableForeignKeyConstraints();
@juza66
@ali.bayat
@sinakhoshdel
من این کار ها رو انجام دادم نشد
جدول من اینه
Schema::create('table_article', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->string('title',100);
$table->string('discription',100);
$table->unsignedBigInteger('category_id');
$table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');
$table->unsignedBigInteger('image_id');
// $table->foreign('image_id')->references('id')->on('images')->onDelete('cascade');
$table->string('type')->nullable();
$table->unsignedBigInteger('Weight_id');//برچسب میباشد
// $table->foreign('weight_id')->references('id')->on('weight')->onDelete('cascade');
$table->integer('price');
$table->string('color');
$table->timestamps();
});
اما این ارور رو میده
SQLSTATE[HY000]: General error: 1005 Can't create table `proj`.`#sql-1096_64` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `table_article` add constraint `table_article_category_id_foreign` foreign key (`category_id`) references `categories` (`id`) on delete cascade)
میشه راهنمایی کنید
سلام دوستان
--------------------------------------- شاید به درد کسی بخوره ------------------------------
منم به این ارور بر خوردم و واسه من 3 تا موضوع بود که ازش این ارور گرفته میشد ( در کل هر 3 مربوط به کلید خارجی بودن )
1. ترتیب ایجاد جدول هایی ( مایگریشن هایی ) که داشتم با کلید خارجی هایی که ایجاد کرده بودم نمیخوند
نکته: ترتیب ایجاد جدول ها و مایگریشن ها و زمان معرفی کلید خارجی ها مهمه
یعنی چی: یعنی اینکه مثلا من اول مایگریشن ( جدول ) user رو داشتم و داخلش کلید خارجی که به مایگریشن ( جدول ) role اشاره کرده بود رو نوشتم و بعد مایگریشن ( جدول ) role رو ساختم =====>>>>> توی اینجا به این گیر داده بود که من هنوز جدول role رو نداشتم و نساخته بودم پس قاعدتا باید هم به کلید خارجی که توی جدول user بود گیر میداد
2. توی جدول میانی ارتباط چند به چند وقتی کلید خارجی تعریف کرده بودم اومده بوده onDelete رو set null قرار داده بودم و به این گیر داده بود البته بعدش خودم هم متوجه شدم که نباید اصلا اینجا onDelete رو set null قرار بدم و باید onDelete رو cascade قرار میدادم
// اشتباه من
// My mistake
$table->foreign('role_id')->references('id')->on('roles')->nullOnDelete();
// درستش
// That's right
$table->foreign('role_id')->references('id')->on('roles')->cascadeOnDelete();
3. و آخرین مورد ==>> این دیگه خیلی ضایع بود
اومده بودم توی کلید خارجی که تعریف کرده بودم رفرنس فیلدی رو داده بودم که وجود نداره
مثلا همین references('name') ولی به جدولی که اشاره کرده بودم اصلا فیلد name توش نبود
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟