laravel 7中外键约束的格式不正确

时间:2020-03-22 05:50:28

标签: laravel

我正在使用laravel构建酒店管理应用程序。我试图在laravel中创建表“ reservations”,但是当我运行“ migrate:fresh”命令时,出现以下错误:错误“外键约束格式不正确”。谁能告诉你这个错误是什么意思?

View Error

.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');
        });
    }

4 个答案:

答案 0 :(得分:1)

Laravel6

Laravel6没有任何方法id()在表中创建idLaravel7确实..我尝试使用id使用$table->id()创建Laravel6并收到以下错误。

似乎您发布了错误错误,或者您已经在表中手动创建了id

您可以使用bigIncrementsbigIntegerincrementsinteger等。

您可以找到所有可用的方法here

Laravel7

根据Laravel7 $table->id()$table->bigIncrements('id')别名的别名,即unsigned big integer

要创建Foreign keychild column的数据类型必须与parent column完全匹配。

由于users.idroom_types.idbigIncrements,因此reservations.user_idreservations.room_type_id也需要是unsignedbigInteger,而不是{{1 }}。

要使其正常运行

更改

unsignedInteger

$table->unsignedInteger('user_id'); 
$table->unsignedInteger('room_type_id');

赞:

$table->unsignedBigInteger('user_id');
$table->unsignedBigInteger('room_type_id');

https://laravel.com/docs/7.x/migrations#creating-columns

enter image description here

答案 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_idroom_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');
相关问题