【问题标题】:Zend db\NoRecordExists with multiple exclude option issueZend db\NoRecordExists 有多个排除选项问题
【发布时间】:2014-01-17 05:44:46
【问题描述】:

我已经在我的控制器中添加了代码来检查记录是否已经存在。

public function addAction()
{
    $form = new Form();

    $request = $this->getRequest();
    if ($request->isPost()) {
        $role = new Role($this->dbAdapter);
        $form->setInputFilter($role->getInputFilter());
        $form->setData($request->getPost());

        // start here for add validator for already exists same data as entered.
            $db = $this->getServiceLocator()->get('Zend\Db\Adapter\Adapter');
            $validator = new \Zend\Validator\Db\NoRecordExists(
                array(
                    'table'   => 'tbl_roles',
                    'field'   => 'vRoleName',
                    'exclude' => array(
                      'field' => 'iRoleID',
                      'value' => $request->getPost('iRoleID') // note 1
                  ),
                  'adapter' => $db,
                    'messages' => array(
                        \Zend\Validator\Db\NoRecordExists::ERROR_RECORD_FOUND => 'This  Role is already exist.',
                    ),
                )
            );
            $form->getInputFilter()->get('vRoleName')->getValidatorChain()->addValidator($validator);
            // end here for add validator for already exists same data as entered.

        if ($form->isValid()) {
            $role->exchangeArray($form->getData());
            $this->aclRoleTable->saveRole($role);
            $this->flashMessenger()->addMessage('Role Added Successfully.');
            return $this->redirect()->toRoute('role');
        }
    }
  return array('form' => $form);
}

注意 1:我必须在此处添加第二个字段以排除,例如 eDelete = “1”,因此如果存在带有 eDelete = “1”的记录,那么我也可以在我的数据库中添加相同的角色名称。 或者给我一个解决方案,如果存在 eDelete=1 的记录而不是显示 zend 错误,我可以将它从 eDelete = 1 更新为 0。

【问题讨论】:

    标签: php forms zend-framework zend-db zend-validate


    【解决方案1】:

    这里是你可以根据ZF2 documentation做的:

    在您的getInputFilter() 模型函数中:

    $select = new \Zend\Db\Sql\Select();
    $select->from('clientes')
        ->where(array(
            'iRoldId' => $request->getPost('iRoleID'),
            'eDelete' => '1',
        )); 
    
    $inputFilter->add($factory->createInput(array(
        'name'     => 'yourfieldname',
        'validators' => array(
            array( 
                'name'    => 'Db\NoRecordExists',
                'options' => array( 
                    'table'     => 'yourtablename', 
                    'field'     => 'yourfieldname', 
                    'adapter' => 'youradapter',
                    //Here comes the magic
                    'select' => $select,
                ), 
            ), 
        ),
    )));
    

    【讨论】:

      【解决方案2】:

      根据Zend_Validate_Db_Abstract 的父类Zend_Validate_Db_NoRecordExists 的 Zend 代码,您可以将字符串/数组用于“排除”属性,

      /* 'exclude' => An optional where clause or field/value pair to exclude from the query

      你可以试试

      'exclude' => 'iRoldId = ' . $request->getPost('iRoleID') . ' AND eDelete = "1"'
      

      Zend 会给出结果true

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多