对2场Zend_Validate_Db_RecordExists

问题描述 投票:6回答:7

我通常使用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
    }

我有一个数组,逗号分隔的列表试了一下,没有什么工作...任何帮助是值得欢迎的。问候安德烈

zend-framework validation zend-db
7个回答
4
投票

要做到这一点,你将不得不延长Zend_Validate_Db_RecordExists类。

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

你可以只使用两个不同的验证情况下,分别检查这两个领域。这是唯一的解决办法,我可以看到,现在除了扩展它。

如果您选择,然后扩展它,你必须找到所有字段传递给构造函数的一些方法(数组似乎是一个不错的选择),然后你就必须深入到创建SQL查询的方法。在这种方法中,你将不得不环路到构造都通过了场阵列上。


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
投票

这么晚才回复很抱歉。

为我工作最好的办法是这样的:

//  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类。

请享用!!罗萨里奥


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

0
投票

对于使用Zend 2,如果你想检查是否与给定的idemail用户表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 official doc


0
投票

您可以使用此参数中的“排除”传递要过滤通过第二条款。

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

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

0
投票

我使用Zend Framework 3.0版和验证通过InputFilter(),它使用相同的验证规则Zend框架2。

在我来说,我需要检查,如果存在分贝位置(由'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 = ?
© www.soinside.com 2019 - 2024. All rights reserved.