Laravel数据库迁移列更改为唯一和可空导致错误

时间:2019-01-22 19:35:59

标签: laravel doctrine migration dbal

我正在尝试将社交登录与我现有的laravel应用集成。我试图将电子邮件和密码更改为可为空,但我还需要电子邮件以保持唯一性。执行迁移时,我收到重复的键名“ users_email_unique”的错误

Laravel 5已经解决了我更改列所用的枚举的问题。

    Schema::table('users', function (Blueprint $table) {
        $table->string('email')->unique()->nullable()->change();
        $table->string('password')->nullable()->change();
    });

Illuminate \ Database \ QueryException:SQLSTATE [42000]:语法错误或访问冲突:1061重复的键名'users_email_unique'(SQL:alter table users添加唯一的users_email_uniqueemail ))

异常跟踪:

1 Doctrine \ DBAL \ Driver \ PDOException::(“” SQLSTATE [42000]:语法错误或访问冲突:1061重复的键名'users_email_unique'“)

/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:119

2 PDOException::(“ SQLSTATE [42000]:语法错误或访问冲突:1061重复的键名'users_email_unique'”)

/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOStatement.php:117

修改

如果我从电子邮件中删除Unique(),由于先前在其他迁移中设置了唯一性,它将保持唯一性吗?

2 个答案:

答案 0 :(得分:1)

听起来数据库正在检测重复值。对于null来说这是不可能的,因此它可能是一个空字符串。

在这种情况下,您可以在模型中编写一个mutator函数,以检查该值是否为空,并在将其用于数据库引擎之前将其设置为null,如下所示:

public function setNameOfYourAttribute($value) {
    if ( empty($value) ) {
        $this->attributes['nameofyourattribute'] = NULL;
    }
}

希望有帮助。

注意: Full Documentation

答案 1 :(得分:0)

我自己弄清楚了,如上述答案的评论中所述。

这是因为如果删除该表已经使用unique()创建了表,它将允许迁移,并且还将保留原始User表迁移中的unique()功能。