Zend_Validate_Db_RecordExists对2个字段

时间:2011-05-19 13:48:29

标签: zend-framework validation zend-db

我通常使用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 个答案:

答案 0 :(得分:4)

要执行此操作,您必须扩展Zend_Validate_Db_RecordExists类。

它目前不知道如何检查是否存在多个字段。

您可以使用两个不同的验证程序实例分别检查这两个字段。这是除了扩展之外我现在能看到的唯一工作。

如果你选择扩展它,那么你必须找到一些方法将所有字段传递给构造函数(数组似乎是一个不错的选择),然后你将不得不深入研究创建SQL查询。在这个方法中,你必须遍历传递给构造函数的字段数组。

答案 1 :(得分:2)

您应该考虑使用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 example

答案 2 :(得分:2)

很抱歉迟到的回复。

对我有用的最佳选择是:

//  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类的更简洁的解决方案。

享受!! 罗萨里奥

答案 3 :(得分:1)

$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')
                                                      ))),

答案 4 :(得分:0)

对于那些使用Zend 2的人,如果你想检查表id中是否存在给定emailusers的用户,可能就是这样。

首先,创建将用作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 official doc

答案 5 :(得分:0)

您可以在此参数中使用'exclude'传递要过滤的第二个子句。

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

if ($validator->isValid('value') {
  true;
}

答案 6 :(得分:0)

我正在使用zend Framework v.3并通过InputFilter()进行验证,它使用的验证规则与zend Framework 2相同。

在我的情况下,我需要检查db中是否存在位置(通过'id'字段),并且是否需要公司的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 == $valuecompany_id == $companyId的情况下,验证才会通过,如下所示:

select * from location where id = ? AND company_id = ?