lancer_serega
@lancer_serega
PHP Developer

ZF как валидировать по уникальной связке двух полей?

Люди добрые подскажите пожалуйста!
Вот у меня в таблице есть уникальная связка полей table1.`name` и table1.`thingId` (не два отдельных уникальных значений, а одна уникальная пара одного столбца с другим )
Простым языком, я могу создать такие значения
table.`name` = 'Option1' + table.`thingId` = 1;
table.`name` = 'Option2' + table.`thingId` = 1;
table.`name` = 'Option1' + table.`thingId` = 2;

а вот ниже строчку уже не должна создаваться, так как выше уже такая есть
table.`name` = 'Option1' + table.`thingId` = 1;

208c30f813bd4da581ac2925f0ecaae7.jpgb70edb80185242ad8805b91eb919f84e.jpg

Как в зенде сделать такой валидатор? Лазил в инете понял что мне поможет exclude, но применить ее не могу

Вот моя валидация (в ней нужно это сделать )
/**
     * {@inheritDoc}
     */
    protected function _validationRules()
    {
        return [
            'name' => [
                self::PRESENCE => self::PRESENCE_REQUIRED,
                NotEmpty::class,
                [
                    StringLength::class,
                    ['max' => 255],
                ],
                [
                    NoRecordExists::class,
                    [
                        'table' => OptionTableMap::getTableMap()->getName(),
                        'field' => OptionTableMap::getTableMap()->getColumn('name')->getName(),
                        'exclude' => [
                            $this->getData('thingId')
                        ],
                    ],
                ]
            ],

            'slug' => [
                self::PRESENCE => self::PRESENCE_REQUIRED,
                NotEmpty::class,
                [
                    StringLength::class,
                    ['max' => 255],
                ],
            ],

            'thingId' => [
                self::PRESENCE => self::PRESENCE_REQUIRED,
                NotEmpty::class,
                [
                    StringLength::class,
                    ['max' => 11],
                ],
                [
                    Regex::class,
                    ['pattern' => '/^[1-9]\d*$/'],
                ],
                [
                    RecordExists::class,
                    [
                        'table' => ThingTableMap::getTableMap()->getName(),
                        'field' => ThingTableMap::getTableMap()->getColumn('id')->getName(),
                    ]
                ],
            ],

            'select' => [
                [
                    Regex::class,
                    ['pattern' => '/^[01]*$/'],
                ],
            ],

            'accounting' => [
                [
                    Regex::class,
                    ['pattern' => '/^[01]*$/'],
                ],
            ],
        ];
    }

  • Вопрос задан
  • 358 просмотров
Решения вопроса 1
lancer_serega
@lancer_serega Автор вопроса
PHP Developer
Вот решение моей проблемы
/**
     * {@inheritDoc}
     */
    protected function _validationRules()
    {
        $qntValidSelect = new Zend_Db_Select(Zend_Db_Table_Abstract::getDefaultAdapter());
        $qntValidSelect
            ->from(OptionTableMap::TABLE_NAME)
            ->where('Name = ?', $this->getData('name'))
            ->where('ThingId = ?', $this->getData('thingId'));

        return [
            'name' => [
                self::PRESENCE => self::PRESENCE_REQUIRED,
                'NotEmpty',
                [
                    'StringLength',
                    ['max' => 255],
                ],
            ],

            'slug' => [
                self::PRESENCE => self::PRESENCE_REQUIRED,
                'NotEmpty',
                [
                    'StringLength',
                    ['max' => 255],
                ],
            ],

            'thingId' => [
                self::PRESENCE => self::PRESENCE_REQUIRED,
                'NotEmpty',
                [
                    'StringLength',
                    ['max' => 11],
                ],
                [
                    'Regex',
                    ['pattern' => '/^[1-9]\d*$/'],
                ],
                [
                    'DB_RecordExists',
                    [
                        'table' => ThingTableMap::getTableMap()->getName(),
                        'field' => ThingTableMap::getTableMap()->getColumn('id')->getName(),
                    ]
                ],
            ],

            'select' => [
                [
                    'Regex',
                    ['pattern' => '/^[01]*$/'],
                ],
            ],

            'accounting' => [
                [
                    'Regex',
                    ['pattern' => '/^[01]*$/'],
                ],
            ],
        ];
    }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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