2016-03-07 66 views
0

我想允許用戶將電子郵件和電話留在寄存器功能上。我也想要添加任何電子郵件或電話號碼。獨一無二。 但是,構建規則中的isUnique函數正在阻止它,因爲它看到空白字段已存在。cakephp 3構建規則,允許檢查數據是否唯一併允許爲空

public function buildRules(RulesChecker $rules) 
{ 
    $rules->add($rules->isUnique(['username'])); 
    $rules->add($rules->isUnique(['email'])); 
    $rules->add($rules->isUnique(['phone'])); 
    return $rules; 
} 

我該如何解決這個問題? 我已經在驗證中嘗試了 - > allowEmpty,但它不起作用。 這些文件中沒有任何內容。具體如此。

+0

使用普通的比較操作符(其獨特的規則一樣)應該永遠是對'NULL'通常比較'NULL'(AFAIK至少在MySQL和Postgres中是這樣),因此沒有發現任何東西,因此唯一的檢查應該通過。對這種行爲進行重新設計雖然有點不好,所以這可能值得對核心進行改進。不管怎樣,你使用的是哪種DBMS?這些表CREATE TABLE語句是什麼樣的?你試圖保存的數據是什麼樣的? – ndm

+0

我用我的sql的myadmin php。該表允許用於輸入的空值。這是最奇怪的事情,但它會允許第一個空值,但之後它不會允許第二個。 –

回答

0

如果你還沒有找到解決方案,我有一個。 今天我遇到了同樣的問題,我發現空字段的值不等於null。 所以,你需要做的是,在add()和edit()函數中,或者你用來將手機寫入數據庫的功能,你必須檢查手機字段是否等於''。如果是這樣,那麼只需將null分配給它。 例如:

public function add() 
{ 
    //todo: check for conflicting email and phone 

    $user = $this->Users->newEntity(); 
    if ($this->request->is('post')) { 
     $user = $this->Users->patchEntity($user, $this->request->data); 

     //LOOK AT THESE TWO LINES 
     if($user->phone == '') { 
      $user->phone = null; 
     } 

     if ($this->Users->save($user)) { 
      $this->Flash->success(__('The user has been saved.')); 
      return $this->redirect(['action' => 'index']); 
     } else { 
      $this->Flash->error(__('The user could not be saved. Please, try again.')); 
     } 
    } 
    $roles = $this->Users->Roles->find('list', ['limit' => 200]); 
    $this->set(compact('user', 'roles')); 
    $this->set('_serialize', ['user']); 
} 
2

爲了改善divinemaniac答案應該在用戶實體爲此

//Entity/User.php 

protected function _setPhone($value) 
{ 
     if($value == '') { 
      $value = null; 
     } 

     return $value; 
}