Laravel 数据库迁移列更改为 Unique 和 Nullable 导致错误

Laravel Database Migration Column altered to Unique and Nullable causing error

我正在尝试将社交登录与我现有的 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_unique(email))

异常跟踪:

1 Doctrine\DBAL\Driver\PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1061 Duplicate key name 'users_email_unique'")

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

2 PDOException::("SQLSTATE[42000]: Syntax error or access violation: 1061 Duplicate key name 'users_email_unique'")

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

编辑

如果我从电子邮件中删除 Unique(),它是否会保持唯一性,因为它之前是在不同的迁移中设置的?

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

如果是这种情况,您可以在模型中编写一个修改器函数来检查该值是否为空,并在它进入数据库引擎之前将其设置为空,如下所示:

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

希望对您有所帮助。

注意: Full Documentation

如上述答案的评论中所述,这是我自己想出来的。

仅仅因为 table 已经使用 unique() 创建,如果我删除它将允许迁移并且还将保留原始用户 table 迁移中的 unique() 功能.

您可以按照以下步骤更改新迁移中的唯一性行为:

public function up()
{
    Schema::table('contacts', function (Blueprint $table) {
        $table->dropUnique(['email']);
    });
}

/**
 * Reverse the migrations.
 *     
*/
public function down()
{
    Schema::table('contacts', function (Blueprint $table) {
        $table->string('email')->unique()->change();
    });
}

Nullable() 属性将保留在 email 列中,因为它是用它创建的。