سلام به همگی دوستان عزیز
بنده می خوام که با استفاده از کد زیر در مایگرشن یه جدول برای مقالات سایتم درستم کنم.
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
دوستان اشکال رو پیدا کردم.
توی لاراول ورژن 7 وقتی از کد زیر استفاده می کنید دیگه لازم نیست از قبل یه فیلد integer به اسم user_id بسازید بلکه هم کار ساختن فیلد رو انجام میده و هم میاد ارتباط بین جداول رو ایجاد می کنه.
$table->foreignId('user_id')->references('id')->on('users')->onDelete('cascade');
با سلام . میشه کد مایگریشن جدول یوزرتون رو هم بذاررین ؟ شاید نوع فیلد id در جدول users چیزی غیر از integer هست . مثلا اگر فیلد id در جدولی bigInt هست باید فیلد کلید خارجی هم از نوع bigInt باشه . البته هنوز ساختار لاراول 7 رو نگاه نکردم ممکنه مایگریشن تغییر کرده باشه اما از زمانی که لاراول در ورژن 6 تایپ دیفالت id رو به binInt تغییر داد این مشکل زیاد پیش اومد برای خودم .
سلام دوست عزیز
این هم کد مایگریشن جدول کاربران
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();
});
}
این کد رو
$table->integer('user_id')->unsigned();
با کد زیر عوض کنید
$table->bigInteger('user_id')->unsigned();
دوستان اشکال رو پیدا کردم.
توی لاراول ورژن 7 وقتی از کد زیر استفاده می کنید دیگه لازم نیست از قبل یه فیلد integer به اسم user_id بسازید بلکه هم کار ساختن فیلد رو انجام میده و هم میاد ارتباط بین جداول رو ایجاد می کنه.
$table->foreignId('user_id')->references('id')->on('users')->onDelete('cascade');
@Ali.Abbasi1381 ممنون بخاطر به اشتراک گذاری . جالب بود اصلا دقت نکردم به اینکه foreingId هست . ظاهرا تازه اضافه شده به لاراول .
@Ali.Abbasi1381
ممنون. چند ساعتی درگیر این مشکل بودم تا راه حل شما رو خوندم و مشکلم برطرف شد.
یک دنیا ممنون از به اشتراک گذاری راه حلتون
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟