我正在使用laravel构建酒店管理应用程序。我试图在laravel中创建表“ reservations”,但是当我运行“ migrate:fresh”命令时,出现以下错误:错误“外键约束格式不正确”。谁能告诉你这个错误是什么意思?
.Commands
错误消息
public function up()
{
Schema::create('room_types', function (Blueprint $table) {
$table->id();
$table->string('title')->unique();
$table->string('slug')->unique();
$table->string('short_code')->unique();
$table->longText('description')->nullable();
$table->integer('base_capacity')->default(0);
$table->integer('higher_capacity')->default(0);
$table->boolean('extra_bed')->default(0);
$table->integer('kids_capacity')->default(0);
$table->float('base_price',8,2)->default(0);
$table->float('additional_person_price',8,2)->default(0);
$table->float('extra_bed_price',8,2)->default(0);
$table->boolean('status')->default(1);
$table->softDeletes();
$table->timestamps();
});
}
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->string('usertype')->default('user');
$table->string('last_name')->nullable();
$table->string('phone')->nullable();
$table->date('dob')->nullable();
$table->longText('address')->nullable();
$table->enum('sex',['M','F','O'])->default('M');
$table->string('picture')->nullable();
$table->string('id_type')->nullable();
$table->string('id_number')->nullable();
$table->string('id_card_image_front')->nullable();
$table->string('id_card_image_back')->nullable();
$table->string('company_name')->nullable();
$table->string('gst_no')->nullable();
$table->text('remarks')->nullable();
$table->boolean('vip')->default(0);
$table->boolean('status')->default(1);
$table->rememberToken();
$table->timestamps();
});
}
public function up()
{
Schema::create('reservations', function (Blueprint $table) {
$table->id();
$table->integer('uid')->unique();
$table->timestamp('date');
$table->unsignedInteger('user_id');
$table->unsignedInteger('room_type_id');
$table->integer('adults')->default(1);
$table->integer('kids')->default(0);
$table->date('check_in');
$table->date('check_out');
$table->integer('number_of_room')->default(1);
$table->enum('status',['PENDING','CANCEL','SUCCESS'])->default('PENDING');
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('room_type_id')->references('id')->on('room_types')->onDelete('cascade');
});
}
答案 0 :(得分:1)
Laravel6
Laravel6
没有任何方法id()
在表中创建id
。 Laravel7
确实..我尝试使用id
使用$table->id()
创建Laravel6
并收到以下错误。
似乎您发布了错误错误,或者您已经在表中手动创建了id
。
您可以使用bigIncrements
,bigInteger
,increments
,integer
等。
您可以找到所有可用的方法here
Laravel7
根据Laravel7
$table->id()
是$table->bigIncrements('id')
别名的别名,即unsigned big integer
。
要创建Foreign key
,child column
的数据类型必须与parent column
完全匹配。
由于users.id
和room_types.id
是bigIncrements
,因此reservations.user_id
和reservations.room_type_id
也需要是unsignedbigInteger
,而不是{{1 }}。
要使其正常运行
更改
unsignedInteger
至
$table->unsignedInteger('user_id');
$table->unsignedInteger('room_type_id');
赞:
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('room_type_id');
答案 1 :(得分:0)
->onDelete('cascade');
应该在结构创建部分上。
更改为:
public function up()
{
Schema::create('reservations', function (Blueprint $table) {
// Structure
$table->id();
$table->integer('uid')->unique();
$table->timestamp('date');
$table-> unsignedBigInteger('user_id')->onDelete('cascade');
$table-> unsignedBigInteger('room_type_id')->onDelete('cascade');
$table->integer('adults')->default(1);
$table->integer('kids')->default(0);
$table->date('check_in');
$table->date('check_out');
$table->integer('number_of_room')->default(1);
$table->enum('status',['PENDING','CANCEL','SUCCESS'])->default('PENDING');
$table->timestamps();
// Relationships
$table->foreign('user_id')->references('id')->on('users');
$table->foreign('room_type_id')->references('id')->on('room_types');
});
}
答案 2 :(得分:0)
问题似乎与 user_id和room_type_id
的数据类型不匹配$ table-> id(); $ table-> bigIncrements('id');的别名;
https://laravel.com/docs/master/migrations#columns
因此,您需要在user_id
和room_type_id
栏上保留以下内容:
public function up()
{
Schema::create('reservations', function (Blueprint $table) {
// Structure
$table->id();
...
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('room_type_id');
...
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->foreign('room_type_id')->references('id')->on('room_types')->onDelete('cascade');
...
})
}
答案 3 :(得分:0)
在 Laravel 8 上,你可以使用这个
$table->id();
....
$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('room_type_id');
...
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('restrict');
$table->foreign('room_type_id')->references('id')->on('room_types')->onDelete('restrict');