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