我通常使用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
}
我用数组和逗号分隔列表尝试了它,没有任何效果......欢迎任何帮助。 问候 安德烈
答案 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
)。
答案 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
中是否存在给定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
答案 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 == $value
和company_id == $companyId
的情况下,验证才会通过,如下所示:
select * from location where id = ? AND company_id = ?