Laravel将char()值作为外键迁移

时间:2014-07-29 06:53:08

标签: laravel-4 migrate

我使用UUID或GUID作为识别用户等某些记录的方式。我希望能够通过向用户添加外键约束来将某些实体记录链接到用户ID。

由于某种原因,迁移似乎不喜欢添加外键。

有什么建议吗?

  

SQLSTATE [HY000]:常规错误:1215无法添加外键约束

这两个值都是CHAR(36)

class CreateForeignKeys extends Migration {

/**
    * Run the migrations.
    */
    public function up()
    {
        Schema::table('comments', function($table)
        {
            $table->foreign('author_id')->references('uuid')->on('users');
        });
    }

    /**
    * Reverse the migrations.
    */
    public function down()
    {
        Schema::table('comments', function($table)
        {
            $table->dropForeign('comments_author_id_foreign');
        });
    }

}

这是我刚刚在工作中写的东西。唯一的区别是家里的副本有额外的外键创作用于单独的表,但它们有自己的:

Schema::table('table_name', function($table)
        {
            //
        });

我唯一能想到的是在同一个Schema构建器中可能有多个外键创建(上图)。但是,外键仍然与同一个表有关。

uuid表中的users列是一个字符(36) author_id表中的comments列是char(36)

我已经多次检查以确保是这种情况。

2 个答案:

答案 0 :(得分:0)

如果comments表中已存在数据,则当author_id字段违反foreign_key约束时,将抛出此错误。这可能是因为值不在users.uuid列中,或者因为您的表中已有NULL值。

答案 1 :(得分:0)

似乎只有以下列数据类型支持外键约束:

INT AUTO_INCREMENT PRIMARY UNIQUE

使用Laravel的Migrate时。这是因为按照标准,您预计会使用

$table->increments('id');

因此,作为唯一的主键,应该是将列值映射到另一个表的记录所需的唯一内容。这没关系,这只是一种不必要的限制。

根据我发现的情况,添加自定义限制/关系的唯一方法是在您的Eloquent Model类中。请参阅Eloquent Relationships

如果有人找到了更好的解决方案,我很乐意知道,但是现在我想这会做。