我想知道是否有可能在laravel迁移中添加字符串引用的外键。所以,我在第一次文件迁移时有这些代码。
public function up()
{
// roles table
Schema::create('roles', function(Blueprint $table)
{
$table->engine = 'InnoDB';
$table->increments('id');
$table->integer('level')->unsigned();
$table->string('title');
$table->unique('level');
});
// account table
Schema::create('account', function(Blueprint $table)
{
$table->increments('id');
$table->integer('acc_no');
$table->string('acc_username');
$table->string('acc_password');
$table->integer('acc_roles_level')->unsigned();
$table->softDeletes();
$table->timestamps();
$table->unique('acc_username');
});
然后在第二个迁移文件中我有这个代码:
public function up()
{
Schema::table('account', function(Blueprint $table)
{
$table->foreign('acc_roles_level')
->references('level')->on('roles')
->onUpdate('cascade')
->onDelete('set null');
});
}
迁移运行时,会显示错误:
SQLSTATE [HY000]:常规错误:1215无法在更新时添加外键约束(SQL:alter table`count`添加约束account_acc_roles_level_forevel外键(`acc_roles_level`)引用`roles`(`level`)对delete set null cascade)更新级联)
我不知道为什么我不能引用字符串列。同时,我在mysql上成功运行此代码而没有错误:
alter table account add foreign key acc_roles_level references roles(level)
有没有人遇到过类似的问题?
答案 0 :(得分:1)
您必须更改迁移顺序
|-database/
|--migrations/
|---2015_02_02_141725_create_account_table.php
|---2015_03_01_234626_create_roles_table.php
应该是:
|-database/
|--migrations/
|---2015_01_01_234626_create_roles_table.php
|---2015_02_02_141725_create_account_table.php
最后:
php artisan migrate
答案 1 :(得分:0)
经过大量搜索后,我改变了我的表格
用户表
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->string('user_id');
$table->string('short_name');
$table->string('display_name');
$table->string('username');
$table->string('email');
}
到
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->engine = 'InnoDB'; // <- add this
$table->string('user_id')->primary(); // <- and this
$table->string('short_name');
$table->string('display_name');
$table->string('username');
$table->string('email');
}
bonus_user 表
public function up()
{
Schema::create('bonus_user', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->string('bonus_id');
$table->string('user_id');
});
Schema::table('bonus_user', function (Blueprint $table) {
$table->foreign('bonus_id')->references('bonus_id')->on('bonuses')->onDelete('cascade');
$table->foreign('user_id')->references('user_id')->on('users')->onDelete('cascade');
});
}
innoDB 我从这里SO laravel foreign key migration ref string issue(见答案2)
primary()我从这里enter link description here得到了(虽然我没有按照答案的任何其他部分,因为我必须将我的主键作为字符串,因为它& #39; s以24字符串的形式提供给我!)
我认为这两个变化是一起工作的,因为它不仅仅适用于InnoDB引擎更改。
迁移顺序也可能是解决方案的一部分,但由于引用此外键的我的bonus_user表是在原始用户表迁移后生成的,因此创建问题的顺序对我来说不是问题!
将primary()添加到user_id列后,它首次使用了!