具有多列的Validator \ Db \ RecordExists

时间:2015-09-28 16:34:54

标签: zend-framework2 zend-db zend-validate

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条件一起使用吗?只有那些?

1 个答案:

答案 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。