Я пытаюсь интегрировать социальные логины с моим существующим приложением laravel. Я пытаюсь изменить электронную почту и пароль на nullable, но мне также нужно, чтобы электронная почта оставалась уникальной. При выполнении моей миграции я получаю сообщение об ошибке для повторяющегося имени ключа «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: изменить таблицу users, добавить уникальный users_email_unique (email))
Трассировка исключения:
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() из электронной почты, останется ли он уникальным, поскольку он был ранее установлен в другой миграции?






Похоже, база данных обнаруживает повторяющееся значение. Это невозможно с нулями, поэтому, возможно, это может быть пустая строка.
Если это так, вы можете написать функцию-мутатор в своей модели, чтобы проверить, является ли значение пустым, и установить для него значение null, прежде чем оно попадет в механизм базы данных, например:
public function setNameOfYourAttribute($value) {
if ( empty($value) ) {
$this->attributes['nameofyourattribute'] = NULL;
}
}
Надеюсь, поможет.
ЗАМЕТКА: Полная документация
Я понял это сам, как упоминалось в комментарии к приведенному выше ответу.
Просто потому, что таблица уже была создана с помощью unique(), если я удалю ее, она разрешит миграцию, а также сохранит функциональность unique(), которая была в исходной миграции таблицы User.
Вы можете изменить поведение уникальности в новой миграции, выполнив следующие действия:
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, поскольку он был создан вместе с ним.
если я 'изменю $table->string('email')->unique()->nullable()->change();' в '$table->string('email')->nullable()->change();' затем он работает нормально, но боится, что теряет уникальный атрибут, который был в исходной миграции для модели, которую я редактирую.