ZF2 docs在使用带有多列的 Db \ RecordExists 验证程序方面显示以下示例。
$email = 'user@example.com';
$clause = $dbAdapter->quoteIdentifier('email') . ' = ' . $dbAdapter->quoteValue($email);
$validator = new Zend\Validator\Db\RecordExists(
array(
'table' => 'users',
'field' => 'username',
'adapter' => $dbAdapter,
'exclude' => $clause
)
);
if ($validator->isValid($username)) {
// username appears to be valid
} else {
// username is invalid; print the reason
$messages = $validator->getMessages();
foreach ($messages as $message) {
echo "$message\n";
}
}
我已经尝试使用我自己的Select对象,其中包含更复杂的where条件。但是,必须使用值参数调用isValid()。
在上面的示例中,$username
传递给isValid()
。但似乎没有相应的字段定义。
我尝试使用空字符串调用isValid()
,但这不会产生所需的结果,因为Zend\Validator\Db\AbstractDb::query()
总是将值添加到语句中:
$parameters = $statement->getParameterContainer();
$parameters['where1'] = $value;
如果我删除上面的秒行,我的验证器会产生预期的结果。
有人可以详细说明如何将RecordExists与我的自定义Select对象中的where条件一起使用吗?只有那些?
答案 0 :(得分:0)
做到这一点的最好方法可能是通过制作自己的验证程序来扩展Zend Framework的验证程序,因为(No)RecordExists类似乎并不打算处理多个字段(我很乐意成为被证明是错误的,因为这样做会更容易。
由于您发现$parameters['where1']
被$value
覆盖,因此可以通过确保$value
代表第一个where
的值来解决此问题。 。如果使用自定义$select
,则$value
将替换第一个where子句中的值。
这是一个带有自定义选择和多个where条件的RecordExists
使用示例:
$select = new Select();
$select->from('some_table')
->where->equalTo('first_field', 'value1') // this gets overridden
->and->equalTo('second_field', 'value2')
;
$validator = new RecordExists($select);
$validator->setAdapter($someAdapter);
// this overrides value1, but since isValid requires a string,
// the redundantly supplied value allows it to work as expected
$validator->isValid('value1');
以上结果产生以下查询:
SELECT `some_table`.* FROM `some_table` WHERE `first_field` = 'value1' AND `second_field` = 'value2'
...,如果有结果,则isValid
返回true。