Php 拉威尔迁移:和#x201C;外键约束格式不正确(“)

Php 拉威尔迁移:和#x201C;外键约束格式不正确(“),php,mysql,laravel,laravel-migrations,Php,Mysql,Laravel,Laravel Migrations,当我尝试执行php artisan migrate或php artisan migrate:refresh时,迁移失败,出现以下错误: errno:150“外键约束格式不正确” 代码 用户表(已成功迁移) public function up() { Schema::create('users',函数(Blueprint$表){ $table->integer('id',)->primary(); $table->string('name',255); $table->string('姓氏',

当我尝试执行
php artisan migrate
php artisan migrate:refresh
时,迁移失败,出现以下错误:

errno:150“外键约束格式不正确”
代码

用户表(已成功迁移)

public function up()
{
Schema::create('users',函数(Blueprint$表){
$table->integer('id',)->primary();
$table->string('name',255);
$table->string('姓氏',255);
$table->string('email',255)->unique();
$table->string('password',255);
$table->string('profile_image',255);
$table->string('profile_cover',255);
$table->rememberToken();
$table->char('token',255)->unique()->nullable()->default(null);
$table->enum('role'、['user'、'driver'、'、merchant'、'storemanager'、'storeoperator'、'company'、'employee']);
$table->dateTime('created');
$table->dateTime('updated');
});
}
地址表(因错误而失败)

public function up()
{
Schema::create('address',函数(Blueprint$表){
$table->integer('id')->primary();
$table->string('address1');
$table->string('address2');
$table->string('city');
$table->integer('country')->unsigned();
$table->decimal(‘纬度’);
$table->decimal(‘经度’);
$table->string('instructions');
$table->integer('default');
$table->integer('user')->unsigned();
$table->dateTime('created');
$table->dateTime('updated');
$table->foreign('country')->references('id')->on('country')->onUpdate('cascade');
$table->foreign('user')->references('id')->on('users')->onUpdate('cascade');
});
}

每个表上的数据类型必须与键控列完全匹配。在
用户
上,id是有符号整数;在
地址
上,用户是无符号整数。我建议对id使用无符号整数,因为它永远不会变为负数,并且会给您一个更高的上限。

每个表上的数据类型必须与键列完全匹配。在
用户
上,id是有符号整数;在
地址
上,用户是无符号整数。我建议对id使用无符号整数,因为它永远不会变为负数,并且会给您一个更高的上限。

在您的
地址中,而不是:

$table->integer('user')->unsigned();
付诸表决:


FK键和引用键应为同一类型。

在您的
地址中
迁移,而不是:

$table->integer('user')->unsigned();
付诸表决:


FK和引用键应为同一类型。

您可以将表用户的id更改为:

$table->id();
并将地址表
user
更改为
user\u id
,并尝试如下更改外来id:

$table->foreigned('user_id')->constrained()->onDelete('cascade');

您可以将表用户的id更改为:

$table->id();
并将地址表
user
更改为
user\u id
,并尝试如下更改外来id:

$table->foreigned('user_id')->constrained()->onDelete('cascade');

使用Laravel这样的框架的原因之一是语法上的糖分。通过遵循它们的约定,您可以编写更少的代码,并且必须更少地考虑应用程序的“螺母和螺栓”

你正在做与此相反的事情,并且已经看到了后果。一旦你尝试建立模型和他们的关系,你会经历更多的痛苦。相反,您应该使用如下所示的迁移:


使用Laravel这样的框架的原因之一是语法上的糖分。通过遵循它们的约定,您可以编写更少的代码,并且必须更少地考虑应用程序的“螺母和螺栓”

你正在做与此相反的事情,并且已经看到了后果。一旦你尝试建立模型和他们的关系,你会经历更多的痛苦。相反,您应该使用如下所示的迁移:


失败的原因如@aynber所述。密钥的数据类型必须匹配

遵循Laravel命名主键和外键的最佳实践也很重要。主键应为“id”,外键应为表名(单数)下划线id。例如,如果表名为users,则表用户的外键应为“user\u id”

以下是表地址(复数)的示例

您不必提供另一个表的表名或主键,因为Laravel将从外键(user_id转换为具有主键id的表用户)中找出这一点。稍后,当您创建一个雄辩的模型时,您可以从模型中留下一些信息

    class Address {

        public function user()
        {
            return $this->belongsTo(User::class);
        }
    }

在这里,您不必指定
$table
属性,也不必在
belongsTo
方法中提供外键或主键。

失败的原因如@aynber所述。密钥的数据类型必须匹配

遵循Laravel命名主键和外键的最佳实践也很重要。主键应为“id”,外键应为表名(单数)下划线id。例如,如果表名为users,则表用户的外键应为“user\u id”

以下是表地址(复数)的示例

您不必提供另一个表的表名或主键,因为Laravel将从外键(user_id转换为具有主键id的表用户)中找出这一点。稍后,当您创建一个雄辩的模型时,您可以从模型中留下一些信息

    class Address {

        public function user()
        {
            return $this->belongsTo(User::class);
        }
    }

在这里,您不必指定
$table
属性,也不必在
belongsTo
方法中提供外键或主键。

您使用的是哪个laravel版本?相同的问题