@yii16

Как в Yii2 не падать с ошибкой при повторе в БД?

При записи данных в БД
$phone = new Users();
$phone ->name= '89404445566';
$phone ->save();
if($phone->save()) {
   return 'Ок';
} else {
   return 'Ошибка';
}

Происходит падение с ошибкой Duplicate entry for key но это понятно почему, вопрос как это обработать что бы не вызывать падения приложения?

1) Первый вариант INSERT IGNORE его при способе ActiveRecord можно задействовать, если да, то как указать добавление IGNORE в запрос? Или тут надо обязательно переходить на Data Access Objects что бы ручками запрос писать

2) Второй вариант я так понимаю можно поймать исключение, но исключение - это когда дальнейшая работа приложения невозможна, а тут как раз хочется продолжить и показать нормальную ошибку?
  • Вопрос задан
  • 1025 просмотров
Решения вопроса 3
slo_nik
@slo_nik Куратор тега Yii
Добрый вечер.
Уберите первое сохранение в базу $phone ->save();

P.S.
Хочу добится что бы если пользователь по ошибке или специально ввёл одинаковые данные приложение не упало, а корректно сказало ему "извините такая запись уже есть" и всё.


Для этого, в yii2, существует валидация.
В данном случае Вам подойдёт вот этот встроенный валидатор, который будет проверять передаваемые пользователем данные на уникальность. При попытке передать одинаковые данные он выдаст предупреждение.
Вот так, например, можно проверять адрес e-mail на уникальность
// в модели, в правилах валидации пишите
['email', 'unique', 'targetClass' => self::className(),
                                'message' => 'Извините, такой e-mail уже существует в базе данных',

Так можно проверять и логины и телефоны и всё что пожелаете...
Ответ написан
gobananas
@gobananas
finishhim.ru
Если try/catch юзать то от Yii2
try {
    //...
}
catch (\yii\db\Exception $exception) {
    //...
}
Ответ написан
gubin_niko
@gubin_niko
С ActiveRecord не работал, может там есть способы, как сделать изначально проверку, но можно использовать следующее:

try {
    $phone = new Users();
    $phone->name = '89404445566';
    $phone->save();
    
    // Если на момент "save" возникнет ошибка, то дальше код выполняться не будет и не вернёт true
    return true;
} catch (Exception $exception) {
    // Тут возникла какая-то ошибка при сохранении в БД
    // Можете логировать или вернуть из метода значение false
    // Например:
    return false;
}


Что делать внутри try или catche по итогу, решать вам, но этот способ точно отловит любое исключение и не уронит весь скрипт.

P.S. Ах, вы сами писали про такой вариант. Но при "ловле" исключения никто не мешает нам продолжить работу дальше.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы