Столбец миграции базы данных Laravel изменен на уникальный и нулевой, что вызывает ошибку

Я пытаюсь интегрировать социальные логины с моим существующим приложением 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() из электронной почты, останется ли он уникальным, поскольку он был ранее установлен в другой миграции?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
0
2 120
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Похоже, база данных обнаруживает повторяющееся значение. Это невозможно с нулями, поэтому, возможно, это может быть пустая строка.

Если это так, вы можете написать функцию-мутатор в своей модели, чтобы проверить, является ли значение пустым, и установить для него значение null, прежде чем оно попадет в механизм базы данных, например:

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

Надеюсь, поможет.

ЗАМЕТКА: Полная документация

если я 'изменю $table->string('email')->unique()->nullable()->change();' в '$table->string('email')->nullable()->change();' затем он работает нормально, но боится, что теряет уникальный атрибут, который был в исходной миграции для модели, которую я редактирую.

CirqueM 23.01.2019 23:09
Ответ принят как подходящий

Я понял это сам, как упоминалось в комментарии к приведенному выше ответу.

Просто потому, что таблица уже была создана с помощью 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, поскольку он был создан вместе с ним.

Другие вопросы по теме