مشکل relationship در لاراول 7

2 هفته پیش
توسط سبحان دادخواه آپدیت شد
Ali Abbasi ( 8240 تجربه )
2 هفته پیش
تخصص : برنامه نویس php

سلام به همگی دوستان عزیز
بنده می خوام که با استفاده از کد زیر در مایگرشن یه جدول برای مقالات سایتم درستم کنم.

public function up()
{
    Schema::create('articles',
        function (Blueprint $table) {
            $table->id();
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->string('title');
            $table->string('slug');
            $table->string('tags');
            $table->text('description');
            $table->text('body');
            $table->text('images');
            $table->integer('viewCount');
            $table->integer('commentCount');
            $table->timestamps();
        });
}

ولی وقتی دستور php artisan migrate رو وارد می کنم پیغام زیر رو بر می گردونه.


  SQLSTATE[HY000]: General error: 1005 Can't create table `laravel`.`articles` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `articles` add constraint `articles_user_id_foreign` foreign key (`user_id`) references `users` (`id`) on delete cascade)

  at C:\Users\Ali\Desktop\laravel\vendor\laravel\framework\src\Illuminate\Database\Connection.php:669
    665|         // If an exception occurs when attempting to run a query, we'll format the error
    666|         // message to include the bindings with SQL, which will make this exception a
    667|         // lot more helpful to the developer instead of just the database's errors.
    668|         catch (Exception $e) {
  > 669|             throw new QueryException(
    670|                 $query, $this->prepareBindings($bindings), $e
    671|             );
    672|         }
    673|

  1   C:\Users\Ali\Desktop\laravel\vendor\laravel\framework\src\Illuminate\Database\Connection.php:463
      PDOException::("SQLSTATE[HY000]: General error: 1005 Can't create table `laravel`.`articles` (errno: 150 "Foreign key constraint is incorrectly formed")")

  2   C:\Users\Ali\Desktop\laravel\vendor\laravel\framework\src\Illuminate\Database\Connection.php:463
      PDOStatement::execute()

ممنون می شم که راهنماییم کنید.
@ali.bayat
@hesammousavi

بهترین پاسخ انتخاب شده توسط Ali Abbasi
Ali Abbasi
2 هفته پیش

دوستان اشکال رو پیدا کردم.
توی لاراول ورژن 7 وقتی از کد زیر استفاده می کنید دیگه لازم نیست از قبل یه فیلد integer به اسم user_id بسازید بلکه هم کار ساختن فیلد رو انجام میده و هم میاد ارتباط بین جداول رو ایجاد می کنه.

 $table->foreignId('user_id')->references('id')->on('users')->onDelete('cascade'); 
سیدعلی موسوی ( 86456 تجربه )
2 هفته پیش
تخصص : سی شارپ و پی اچ پی

یکبار این دستور رو بزن

php artisan migrate:fresh
Ali Abbasi ( 8240 تجربه )
2 هفته پیش
تخصص : برنامه نویس php

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

سبحان دادخواه ( 8184 تجربه )
2 هفته پیش

با سلام . میشه کد مایگریشن جدول یوزرتون رو هم بذاررین ؟ شاید نوع فیلد id در جدول users چیزی غیر از integer هست . مثلا اگر فیلد id در جدولی bigInt هست باید فیلد کلید خارجی هم از نوع bigInt باشه . البته هنوز ساختار لاراول 7 رو نگاه نکردم ممکنه مایگریشن تغییر کرده باشه اما از زمانی که لاراول در ورژن 6 تایپ دیفالت id رو به binInt تغییر داد این مشکل زیاد پیش اومد برای خودم .

Ali Abbasi ( 8240 تجربه )
2 هفته پیش
تخصص : برنامه نویس php

سلام دوست عزیز
این هم کد مایگریشن جدول کاربران

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('level','6')->default('user');
        $table->string('email')->unique();
        $table->timestamp('email_verified_at')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}
Mohammadreza Ghomi ( 28025 تجربه )
2 هفته پیش
تخصص : لاراول

این کد رو

$table->integer('user_id')->unsigned();

با کد زیر عوض کنید

  $table->bigInteger('user_id')->unsigned();
Ali Abbasi ( 8240 تجربه )
2 هفته پیش
تخصص : برنامه نویس php

دوستان اشکال رو پیدا کردم.
توی لاراول ورژن 7 وقتی از کد زیر استفاده می کنید دیگه لازم نیست از قبل یه فیلد integer به اسم user_id بسازید بلکه هم کار ساختن فیلد رو انجام میده و هم میاد ارتباط بین جداول رو ایجاد می کنه.

 $table->foreignId('user_id')->references('id')->on('users')->onDelete('cascade'); 
سبحان دادخواه ( 8184 تجربه )
2 هفته پیش

@Ali.Abbasi1381 ممنون بخاطر به اشتراک گذاری . جالب بود اصلا دقت نکردم به اینکه foreingId هست . ظاهرا تازه اضافه شده به لاراول .

برای ارسال پاسخ باید وارد سایت شوید