在Laravel 5.4中,将一个foreign key的bigInteger设置为bigIncrements。
在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(); }); }
问题出现的原因是,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'); });
问题的原因是在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');
感谢以上解决方法,希望对您有所帮助。
在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