2014-01-17 39 views
1

我在控制器中添加了代碼以檢查記錄是否已存在。Zend db NoRecordExists具有多個排除選項問題

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

回答

0

這裏你可以根據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, 
      ), 
     ), 
    ), 
))); 
0

根據Zend_Validate_Db_Abstract類的Zend的代碼是父類的Zend_Validate_Db_NoRecordExists,你可以有字符串/數組 '排除' 屬性,

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

所以你可以嘗試

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

和Zend會給結果true