Laravel外键迁移对String Issue的引用

时间:2015-02-01 16:30:39

标签: php mysql laravel database-migration

我想知道是否有可能在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)

有没有人遇到过类似的问题?

2 个答案:

答案 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列后,它首次使用了!