ZF2 Db \ RecordExists - 检查其他列

时间:2013-01-24 13:51:56

标签: zend-framework2

我的ZF2 RecordExists方法有问题。我将解释我的问题案例/情景。

表:用户 专栏:id,emailaddress,websitename

Sample Records:
        1, user1@email.com, 1site.com
        2, user2@email.com, 1site.com
        3, user3@email.com, 2site.com
        4, user4@email.com, 2site.com
        5, user5@email.com, 1site.com
        6, user6@email.com, 3site.com
        7, user7@email.com, 4site.com

我使用以下代码段已存在状态。

//Check that the email address exists in the database
$validator = new Zend\Validator\Db\RecordExists(
    array(
        'table' => 'users',
        'field' => 'emailaddress'
    )
);

if ($validator->isValid($emailaddress)) {
    // email address appears to be valid
} else {
    // email address is invalid; print the reasons
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}

根据上述代码段,user1 @email.com无法再次注册。因为,那个电子邮件地址存在于表格中。 但是,我想在2site.com注册。因为,user1 @email.com位于1site.com。 因此,user1 @email.com无法再次注册1site.com。但是,user1 @email.com可以在2site.com注册。 这怎么可能?让我知道你的建议。

1 个答案:

答案 0 :(得分:1)

有两种方法可以做到这一点。

首先使用Excluding Record方法 在哪里排除websitename字段值的记录。

  

Zend \ Validator \ Db \ RecordExists和Zend \ Validator \ Db \ NoRecordExists   还提供了一种测试数据库的方法,不包括部分数据库   table,通过提供where子句作为字符串或数组   键“字段”和“值”。

$email     = 'user@example.com';
$clause    = $db->quoteInto('email = ?', $email);
$validator = new Zend\Validator\Db\RecordExists(
    array(
        'table'   => 'users',
        'field'   => 'username',
        '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";
    }
}

第二,编写自己的自定义验证器。 您需要扩展AbstractDB类,并在RecordExists类的方向上创建自己的类。在您自己的cust类中,您可以定义自己的查询并将其传递给isValid函数。

我创建了一个Custom Validator oposite to Exclude,包括。 include是保留字,现在确定它是否有效。 check it here

有关此内容的更多阅读

Guidlines 1

请查看现有的验证工具,以创建自己的自定义验证器Custom validator guildline

Chain validator 2