Zend framework2 Validator\Db\RecordExists具有多个列
显示以下使用多列验证程序的示例Zend framework2 Validator\Db\RecordExists具有多个列,zend-framework2,zend-db,zend-validate,Zend Framework2,Zend Db,Zend Validate,显示以下使用多列验证程序的示例 $email = 'user@example.com'; $clause = $dbAdapter->quoteIdentifier('email') . ' = ' . $dbAdapter->quoteValue($email); $validator = new Zend\Validator\Db\RecordExists( array( 'table' => 'users', 'f
$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";
}
}
我已经尝试过使用我自己的选择对象,其中包含一个更复杂的where条件。但是,必须使用value参数调用isValid()
在上面的示例中,$username
被传递到isValid()
。但似乎没有相应的字段定义
我尝试使用空字符串调用isValid()
,但这不会产生所需的结果,因为Zend\Validator\Db\AbstractDb::query()
总是将值添加到语句中:
$parameters = $statement->getParameterContainer();
$parameters['where1'] = $value;
如果删除上面的秒行,我的验证器将生成预期的结果
有人能详细说明如何使用RecordExists和我的自定义选择对象中的where条件吗?只有那些?实现这一点的最佳方法可能是制作自己的验证程序,扩展Zend Framework的一个验证程序,因为(没有)RecordExists类似乎不是用来处理多个字段的(我很高兴被证明是错的,因为如果它们这样做会更容易) 正如您所发现的,
$parameters['where1']
被$value
覆盖,因此您可以通过确保$value
表示第一个的值,其中应该是什么来处理这个问题。如果使用自定义的$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