Soh3illl
5 سال پیش توسط Soh3illl مطرح شد
9 پاسخ

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

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

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


ثبت پرسش جدید
Soh3illl
تخصص : برنامه نویس php
@soh3illl 5 سال پیش مطرح شد
3

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

 $table->foreignId('user_id')->references('id')->on('users')->onDelete('cascade'); 

سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 5 سال پیش آپدیت شد
1

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

php artisan migrate:fresh

Soh3illl
تخصص : برنامه نویس php
@soh3illl 5 سال پیش مطرح شد
0

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


سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 5 سال پیش مطرح شد
1

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


Soh3illl
تخصص : برنامه نویس php
@soh3illl 5 سال پیش مطرح شد
0

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

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();
    });
}

محمدرضا قمی اویلی
تخصص : لاراول
@ghomi 5 سال پیش مطرح شد
1

این کد رو

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

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

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

Soh3illl
تخصص : برنامه نویس php
@soh3illl 5 سال پیش مطرح شد
3

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

 $table->foreignId('user_id')->references('id')->on('users')->onDelete('cascade'); 

سبحان دادخواه
تخصص : دانشجوی برنامه نویسی :)
@SobhanDadkhah 5 سال پیش مطرح شد
1

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


احسان
تخصص : توسعه دهنده وب
@ehsan99 4 سال پیش مطرح شد
0

@Ali.Abbasi1381
ممنون. چند ساعتی درگیر این مشکل بودم تا راه حل شما رو خوندم و مشکلم برطرف شد.
یک دنیا ممنون از به اشتراک گذاری راه حلتون


محمد میرزاخانی
@mirzamohammad.com 3 سال پیش مطرح شد
0

very very good


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

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