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;
}
}
希望对您有所帮助。
如上述答案的评论中所述,这是我自己想出来的。
仅仅因为 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
列中,因为它是用它创建的。
我正在尝试将社交登录与我现有的 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;
}
}
希望对您有所帮助。
如上述答案的评论中所述,这是我自己想出来的。
仅仅因为 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
列中,因为它是用它创建的。