在Laravel 5.4中,将一个foreign key的bigInteger设置为bigIncrements。

8 浏览
0 Comments

在Laravel 5.4中,将一个foreign key的bigInteger设置为bigIncrements。

所以我在Laravel的迁移文件中尝试设置一个外键,使用户表变得简单,但我想使用bigIncrements而不是increments。代码如下:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        $table->bigIncrements('id')->unsigned();
        $table->string('user_id')->unique();
        $table->string('avatar');
        $table->string('name');
        $table->string('email')->unique();
        $table->string('password')->nullable();
        $table->rememberToken();
        $table->timestampsTz();
    });
}

当我在另一个表中尝试添加外键时,我收到一个错误,说外键格式不正确。我对此感到困惑,因为我在匹配列类型。以下是另一个表的代码:

public function up()
{
    Schema::create('social_logins', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        $table->bigIncrements('id');
        $table->bigInteger('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade')->unsigned()->index();
        $table->string('provider', 32);
        $table->string('provider_id');
        $table->string('token')->nullable();
        $table->string('avatar')->nullable();
        $table->timestamps();
    });
}

0
0 Comments

问题出现的原因是,bigIncrements在Laravel 5.4中返回的是一个unsignedBigInteger类型的值。然而,为了让外键正常工作,外键必须是一个带有index()的无符号大整数。

解决方法如下:

1. 将原来的bigIncrements('id')替换为unsignedBigInteger('id'),这样可以将外键字段设置为无符号大整数。

2. 在外键字段后面添加index()方法,以确保外键的索引被正确创建。

下面是解决方案的示例代码:

Schema::create('table_name', function (Blueprint $table) {
    $table->unsignedBigInteger('foreign_key')->index();
    // 其他字段...
    $table->foreign('foreign_key')->references('id')->on('other_table');
});

0
0 Comments

问题的原因是在Laravel 5.4中,当设置一个外键的数据类型为bigInteger时,使用bigIncrements作为主键类型会导致错误。解决方法是将主键类型修改为bigInteger,并移除unsigned()方法的调用,或者直接使用unsignedBigInteger作为数据类型。

在Laravel 5.4中,设置外键的数据类型为bigInteger时,使用bigIncrements作为主键类型会导致错误。因此,需要将主键类型修改为bigInteger,并移除unsigned()方法的调用。另外,在迁移文件中,还需要添加foreign方法来设置外键关联,并指定引用的表和字段,最后使用onDelete方法设置级联删除,index方法添加索引。

具体的解决方法如下所示:

1. 将下面的代码中的unsigned()方法移除:

$table->bigIncrements('id')->unsigned();

2. 将另一个迁移文件中的代码修改为以下形式:

$table->bigInteger('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
....
$table->index('user_id');

3. 或者直接使用unsignedBigInteger作为数据类型:

$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
....
$table->index('user_id');

感谢以上解决方法,希望对您有所帮助。

0
0 Comments

在Laravel 5.4中,将一个foreign key的bigInteger设置为bigIncrements时会出现问题。出现这个问题的原因是primary和foreign references必须是相同类型的。在Laravel中,使用bigIncrements()时需要使用unsignedBigInteger(),而使用increments()时需要使用unsignedInteger()。如果在users表中使用$table->bigIncrements('id');作为主键,则应该使用$table->unsignedBigInteger('user_id');作为foreign key。如果在users表中使用$table->increments('id');作为主键,则应该使用$table->unsignedInteger('user_id');作为foreign key。$table->increments()创建的是整数,而$table->bigIncrements()创建的是大整数,所以引用类型必须相同。详细信息请参考https://laravel.com/docs/4.2/schema#adding-columns

0