Задать вопрос
@lolka02

Почему не работает unique в модели Yii2?

Вобщем есть консольное команда Hello там есть action Test. при запуске одновременно несколько таких процессов получается дубли и не работает валидация unique в модели

public function actionTest()
    {
        $email = 'mail@test.ru';
        $doubleModels = Test::findOne(['email' => $email]);
        if (!$doubleModels) {
            $model = new Test();
            $model->email = $email;
            $model->save();
        }
    }


А в модели Test.php есть валидация

/**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            ['email', 'unique'],
            [['email'], 'string', 'max' => 255],
        ];
    }


для проверки сделал несколько одинаковых крон задач и одновременно запускаю
23 */1 * * * cd /var/www/domain/data/www; /usr/bin/php yii hello/test
23 */1 * * * cd /var/www/domain/data/www; /usr/bin/php yii hello/test
23 */1 * * * cd /var/www/domain/data/www; /usr/bin/php yii hello/test
23 */1 * * * cd /var/www/domain/data/www; /usr/bin/php yii hello/test

Получается 4 записи , хотя в модели есть unique у поле email.

Как исправить такие косяки? чтобы в рабочих скриптах такого не было
  • Вопрос задан
  • 197 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
myks92
@myks92 Куратор тега Yii
Нашёл решение — пометь вопрос ответом!
Попробуйте так
public function actionTest()
    {
        $email = 'mail@test.ru';
        $emailExists = Test::find()->where(['email' => $email])->exists();
        if (!$emailExists) {
            $model = new Test();
            $model->email = $email;
            $model->save(false);
        }
    }
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Arik
unique делает сам запрос и проверяет наличие, выходит несколько процессов успевают одновременно и проверить и записать, поэтому на стороне БД ставим уникальный ключ на поле эл. почты
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы