خطای تعریف foreign key در artisan لاراول

سلام وقتتون بخیر باشه

من یک پروژه در لاراول 8.83 انجام میدم،و به تمام کلید های خارجی گیر میده و هیچ مایگریتی انجام نمیشه،می خواستم ببینم کجای کار مشکل داره.

از 

$table->foreignId('user_id')->constrained();

استفاده کردم،ولی جواب نگرفتم.

ممنون میشم اگر راهنماییم کنین.

2023-02-06_thumb.png
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('last_name');
            $table->string('national_code');
            $table->string('phone');
            $table->string('birthday');
            $table->tinyInteger('gender');
            $table->string('bank_number');
            $table->unsignedInteger('province_id');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->foreign('province_id')->references('id')->on('provinces')->onDelete('cascade');
            $table->rememberToken();
            $table->timestamps();
        });
    }
    public function up()
    {
        Schema::create('provinces', function (Blueprint $table) {
            $table->id();
            $table->string('province');
            $table->string('city');
            $table->boolean('active');
            $table->timestamps();
        });
    }

  SQLSTATE[HY000]: General error: 1005 Can't create table `kliniketo_db`.`#sql-74b8_d3` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `users` add constraint `users_province_id_foreign` foreign key (`province_id`) references `provinces` (`id`) on delete cascade)

  at D:\xampp\htdocs\kliniketo-website\vendor\laravel\framework\src\Illuminate\Database\Connection.php:712
    708▕         // If an exception occurs when attempting to run a query, we'll format the error
    709▕         // message to include the bindings with SQL, which will make this exception a
    710▕         // lot more helpful to the developer instead of just the database's errors.
    711▕         catch (Exception $e) {
  ➜ 712▕             throw new QueryException(
    713▕                 $query, $this->prepareBindings($bindings), $e
    714▕             );
    715▕         }
    716▕     }

برچسب ها:
پرسیده شده در: 1 سال قبل
آمار بازدید: 675
1

سلام امیدوارم حال شما خوب باشه. خطایی که مشاهده می کنید به دلیل کلیدی به اسم province_id هست که از نوع unsignedInteger تعریف شده است. برای حل این مشکل باید دوتا نکته رو در نظر داشته باشید:

۱) وقتی شما از دستور table->id به هنگام ساخت جدول provinces استفاده می کنید. یک فیلد از نوع BIG INTEGER برای شما ساخته می شود.

۲) وقتی میخواهید یک ریلیشن برای جدول provinces در جدول users بنویسید باید حتما به جای دستور unsignedInteger از دستور unsignedBigInteger استفاده کنید.

با توجه به نکات بالا لطفا خط زیر را :

$table->unsignedInteger('province_id');

به خط زیر تغییر بدهید:

$table->unsignedBigInteger('province_id');
ارسال شده در: 1 سال قبل
masoudsalehi (1725)
بیش از ۲ سال عضویت در روکسو بیش از ۲ سال عضویت در روکسو دارای 1000 کارما دارای 1000 کارما نظرات دریافتی:‌ بیش از 50 نظرات دریافتی:‌ بیش از 50 دارای 25 پاسخ صحیح دارای 25 پاسخ صحیح ارسال کننده پاسخ با 25 رای ارسال کننده پاسخ با 25 رای
0

سلام مجدد

سپاس از پاسختون 

این کار رو هم انجام دادم ولی متاسفانه باز همون خطا رو میده، در دیتابیس ذخیره میشه اما کلید خارجی رو بوجود نمی یاره

2023-02-08_thumb.png
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('last_name');
            $table->string('national_code');
            $table->string('phone');
            $table->string('birthday');
            $table->tinyInteger('gender');
            $table->string('bank_number');
            $table->unsignedBigInteger('province_id');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->foreign('province_id')->references('id')->on('provinces')->onDelete('cascade');
            $table->rememberToken();
            $table->timestamps();
        });
    }
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table

   Illuminate\Database\QueryException 

  SQLSTATE[HY000]: General error: 1005 Can't create table `kliniketo_db`.`#sql-74b8_675` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `users` add constraint `users_province_id_foreign` foreign key (`province_id`) references `provinces` (`id`) on delete cascade)

  at D:\xampp\htdocs\kliniketo-website\vendor\laravel\framework\src\Illuminate\Database\Connection.php:712
    708▕         // If an exception occurs when attempting to run a query, we'll format the error
    709▕         // message to include the bindings with SQL, which will make this exception a
    710▕         // lot more helpful to the developer instead of just the database's errors.
    711▕         catch (Exception $e) {
  ➜ 712▕             throw new QueryException(
    713▕                 $query, $this->prepareBindings($bindings), $e
    714▕             );
    715▕         }
    716▕     }

ارسال شده در: 1 سال قبل
کل مایگریشن رو حذف کنید و ابتدا مایگریشن provinces رو ران کنید و بعدش مایگریشن مربوط به جدول یوزر رو. احتمالا جدول provinces رو نمیشناسه در ابتدا. - masoudsalehi در 1 سال قبل
0

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

    public function up()
    {
        Schema::create('AddProvinceUserTable', function (Blueprint $table) {
            $table->unsignedBigInteger('province_id');
            $table->foreign('province_id')->references('id')->on('provinces');


            $table->unsignedBigInteger('user_id');
            $table->foreign('user_id')->references('id')->on('users');
        });
    }
ارسال شده در: 1 سال قبل
1
بعضی از مواقع هم این اتفاق می افته و بهترین روش همین کاری هست که انجام دادید. یه مقداری مایگریشن لاراول روی ترتیب ماگریت هایی که انجام میشه حساس هست و این کاری که کردید کاملا درسته. - masoudsalehi در 1 سال قبل
جهت ارسال پاسخ ابتدا عضو سایت شوید.