我通常使用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_Validate_Db_RecordExists类。
它目前不知道如何检查多个字段的存在。
你可以只使用两个不同的验证情况下,分别检查这两个领域。这是唯一的解决办法,我可以看到,现在除了扩展它。
如果您选择,然后扩展它,你必须找到所有字段传递给构造函数的一些方法(数组似乎是一个不错的选择),然后你就必须深入到创建SQL查询的方法。在这种方法中,你将不得不环路到构造都通过了场阵列上。
你应该考虑使用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
)。
这么晚才回复很抱歉。
为我工作最好的办法是这样的:
// 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类。
请享用!!罗萨里奥
$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')
))),
对于使用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 official doc
您可以使用此参数中的“排除”传递要过滤通过第二条款。
$clause = 'table.field2 = value';
$validator = new Zend_Validate_Db_RecordExists(
array(
'table' => 'table',
'field' => 'field1',
'exclude' => $clause
)
);
if ($validator->isValid('value') {
true;
}
我使用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 == $value
和company_id == $companyId
,旁边似:
select * from location where id = ? AND company_id = ?