使用Zend和doctrine查询现有用户名的数据库

时间:2011-11-04 18:21:32

标签: database zend-framework doctrine

我正在查询数据库记录以检查用户名是否已经存在:

$q = Doctrine_Query::create()
        ->from('Tcc_Model_User u')
        ->where('u.Username = ?', $input['Username']);

 $object = $q->fetchOne();

  if(is_object($object)) {

  // not sure what to do here

 } else {

 // ok to record

我无法使其工作的是如何在提交的表单的用户名字段旁边显示已经采用用户名的消息。可以请任何人帮助我吗?真的很感激任何帮助。谢谢

已编辑:

感谢Drew010,我通过添加:

解决了上述问题
 $form->getElement('Username')->addError('Sorry, that username is already taken!');

在第一个条件语句中。再次感谢drew010。

2 个答案:

答案 0 :(得分:2)

由于您使用的是Zend_Form,因此有一个验证器可以为您执行此操作。

请参阅Zend_Validate_DbNoRecordExists

他们给出了验证数据库中不存在给定用户名的示例。

以下是我的某个应用程序的示例,第三个验证程序检查用户名是否已存在:

    $this->addElement('text', 'username', array(
        'label' => 'User Name:',
        'required' => true,
        'validators' => array('NotEmpty'),
        'decorators' => $this->elementDecorators,
        'validators' => array(
            array('StringLength', true, array('min' => 4,
                'messages' => array(
                    Zend_Validate_StringLength::TOO_SHORT =>
                    'Account username must be at least %min% characters'
                )
            )),
            array('Regex', true, array('pattern' => '/^\w(?:[\w\d\.\-_]+)(?:\w|\d)$/',
                'messages' => array(
                    Zend_Validate_Regex::NOT_MATCH =>
                    "The username contained invalid characters"
                )
            )),
            array('Db_NoRecordExists', true, array(
                'table' => 'accounts', 'field' => 'username',
                'messages' => array(
                    Zend_Validate_Db_NoRecordExists::ERROR_RECORD_FOUND =>
                    "An account with the username '%value%' is already registered"
                )
            ))
        )
    ));

此外,为了将来参考,如果您使用验证器进行扩展验证,则可以向特定表单元素添加错误,如下所示:

if ($something_was_wrong) {
    $form->getElement('username')
         ->addError('Username already exists!');
}

答案 1 :(得分:0)

我会在Zend_Validate_Db_NoRecordExists验证器上创建一个单独的基于Doctrine的验证器,并将该验证器直接添加到元素

验证员:

class My_Validate_UsernameAvailable extends Zend_Validate_Abstract
    implements Zend_Validate_Interface
{
    const NOT_AVAILABLE = 'usernameAvailableNot';

    protected $_messageTemplates = array(
        self::NOT_AVAILABLE => "Username is not available",
    );

    public function isValid($value)
    {
        $q = Doctrine_Query::create()
            ->from('Tcc_Model_User u')
            ->where('u.Username = ?', $value);

        if ($q->fetchOne()){
            $this->_error(self::NOT_AVAILABLE);
            return false;
        }

        return true;
    }
}

然后在表单中,附加到用户名元素:

'validators' => array(
    // your other valiadators
    array(new My_Validate_UsernameAvailable(), true),
),

然后控制器不需要额外的处理。