Zend_Validate_Db_RecordExists против 2 полей - PullRequest
6 голосов
/ 19 мая 2011

Обычно я использую Zend_Validate_Db_RecordExists для обновления или вставки записи.Это хорошо работает с одним полем для проверки.Как это сделать, если у вас есть два поля для проверки?

 $validator = new Zend_Validate_Db_RecordExists(
        array(
            'table' => $this->_name,
            'field' => 'id_sector,day_of_week'
            )
    );

    if ($validator->isValid($fields_values['id_sector'],$fields_values['day_of_week'])){
        //true
    }

Я пробовал это с массивом и списком через запятую, ничего не работает ... Любая помощь приветствуется.С уважением, Андреа

Ответы [ 7 ]

4 голосов
/ 19 мая 2011

Для этого вам нужно расширить класс Zend_Validate_Db_RecordExists.

В настоящее время он не знает, как проверить наличие более одного поля.

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

Если вы решите расширить его, то вам нужно будет найти какой-то способ передачи всех полей конструктору (массив кажется хорошим выбором), а затем вам нужно будет углубиться в метод, который создает SQL запрос В этом методе вам придется зацикливаться на массиве полей, которые были переданы в конструктор.

2 голосов
/ 14 апреля 2015

Извините за поздний ответ.

Лучший вариант, который сработал для меня, таков:

//  create an instance of the Zend_Validate_Db_RecordExists class
//  pass in the database table name and the first field (as usual)...
$validator = new Zend_Validate_Db_RecordExists(array(
    'table' => 'tablename',
    'field' => 'first_field'
));

// reset the where clause used by Zend_Validate_Db_RecordExists
$validator->getSelect()->reset('where');

// set again the first field and the second field. 
// :value is a named parameter that will be substituted 
// by the value passed to the isValid method
$validator->getSelect()->where('first_field = ?', $first_field);
$validator->getSelect()->where('second_field = :value', $second_field);

// add your new record exist based on 2 fields validator to your element.
$element = new Zend_Form_Element_Text('element');
$element->addValidator($validator);

// add the validated element to the form.
$form->addElement($element);

Я надеюсь, что это кому-нибудь поможетрасширить класс Zend_Validate_Db_RecordExists с помощью приведенного выше кода.

Наслаждайтесь!Росарио

2 голосов
/ 01 сентября 2011

Вам следует использовать параметр exclude.Что-то вроде этого должно делать то, что вы хотите:

$validator = new Zend_Validate_Db_RecordExists(
array(
        'table'   => $this->_name,
        'field'   => 'id_sector',
        'exclude' => array(
            'field' => 'day_of_week',
            'value' => $fields_values['day_of_week']
        )
);

Поле исключения эффективно добавит к автоматически сгенерированной детали WHERE, чтобы создать нечто эквивалентное этому:

WHERE `id_sector` = $fields_values['id_sector'] AND `day_of_week` = $fields_values['day_of_week']

Его видхак в том, что мы используем его в противоположность тому, что было задумано, но он работает для меня примерно так (я использую его с Db_NoRecordExists).

Источник: Пример Zend_Validate_Db_NoRecordExists

1 голос
/ 09 июня 2014
$dbAdapter = Zend_Db_Table::getDefaultAdapter();

'validators' => array('EmailAddress',  $obj= new Zend_Validate_Db_NoRecordExists(array('adapter'=>$dbAdapter,
                                                        'field'=>'email',
                                                        'table'=>'user',         
                                                        'exclude'=>array('field'=>'email','value'=>$this->_options['email'], 'field'=>'is_deleted', 'value'=>'1')
                                                      ))),
0 голосов
/ 11 февраля 2019

Я использую Zend Framework v.3 и проверку через InputFilter(), он использует те же правила проверки, что и Zend Framework 2.

В моем случае мне нужно проверить, существует ли местоположение в db (от 'id' поле) и требуется идентификатор компании ('company_id' поле).

Я реализовал это следующим образом:

    $clause = new Operator('company_id', Operator::OP_EQ, $companyId);

    $inputFilter->add([
        'name' => 'location_id',
        'required' => false,
        'filters' => [
            ['name' => 'StringTrim'],
            ['name' => 'ToInt'],
        ],
        'validators' => [
            [
                'name' => 'Int',
            ],
            [
                'name' => 'dbRecordExists',
                'options' => [
                    'adapter' => $dbAdapterCore,
                    'table' => 'locations',
                    'field' => 'id',
                    'exclude' => $clause,
                    'messages'  => [
                        'noRecordFound' => "Location does not exist.",
                    ],
                ]
            ],
        ],
    ]);

В этом случае проверка пройдет, только если 'locations'В таблице есть элемент со столбцами id == $value и company_id == $companyId, например:

select * from location where id = ? AND company_id = ?
0 голосов
/ 15 января 2016

Вы можете использовать исключение в этом параметре, передавая второе предложение, через которое вы хотите фильтровать.

$clause = 'table.field2 = value';
$validator = new Zend_Validate_Db_RecordExists(
  array(
    'table' => 'table',
    'field' => 'field1',
    'exclude' => $clause
  )
);

if ($validator->isValid('value') {
  true;
}
0 голосов
/ 06 октября 2015

Для тех, кто использует Zend 2, если вы хотите проверить, существует ли пользователь с данными id и email в таблице users, это возможно таким образом.

Сначала вы создаете объект выбора, который будет использоваться в качестве параметра для Zend\Validator\Db\RecordExists объекта

$select = new Zend\Db\Sql\Select();
$select->from('users')
       ->where->equalTo('id', $user_id)
       ->where->equalTo('email', $email);

Теперь создайте RecordExists объект и проверьте существование таким образом

$validator = new Zend\Validator\Db\RecordExists($select);
$validator->setAdapter($dbAdapter);

if ($validator->isValid($username)) {
    echo 'This user is valid';
} else {
    //get and display errors
    $messages = $validator->getMessages();
    foreach ($messages as $message) {
        echo "$message\n";
    }
}

Этот образец взят из Официальный документ ZF2

...