2010-07-14 44 views
1

當我從註冊表單中保存信息時,我對用戶名和電子郵件字段(我粘貼了下面的規則)有一些驗證規則。使用saveAll()函數自動調用驗證。Cakephp isUnique驗證不在一個字段上觸發,但在另一個字段上工作

問題是,用戶名字段上的isUnique規則根本不起作用(不返回任何錯誤)。該領域的其他規則工作得很好,並且對電子郵件字段的唯一驗證也起作用。我似乎無法弄清楚爲什麼會發生這種情況,兩個規則基本相同。

var $validate = array(

    'username' => array(

     'isUnique' => array (

      'rule' => 'isUnique', 

      'message' => 'This username already exists.'), 

     'custom' => array (

      'rule' => array('custom', '/^[A-Za-z0-9,\.-_]*$/i'), 

      'message' => 'The username can only contain letters, numbers, _, - and .'), 

     'minLength' => array(

      'rule' => VALID_NOT_EMPTY, 

      'message' => 'You must fill in the username.')   
    ), 

    'email' => array(

     'isUnique' => array (

      'rule' => 'isUnique', 

      'message' => 'This email address already exists in our database.'), 

     'valid' => array (

      'rule' => array('email', false), 

      'message' => 'Invalid email.'), 

     'minLength' => array(

      'rule' => VALID_NOT_EMPTY, 

      'message' => 'You must fill in the email address.') 

    ) 

); 
+0

我敢肯定,爲了讓它知道這是獨一無二的,你需要設置你的模型文件中的主鍵,並且還通過了相同的領域被保存在您的文章數據。 – 2010-07-14 16:48:49

+0

我已經將模型中的用戶名字段聲明爲主鍵,並且它與發佈數據中的字段相同,並且我已檢查過該字段的內容是否正確。 但我不確定它必須是主鍵。唯一的規則僅適用於電子郵件的文件,即使它不是主鍵。 – 2010-07-14 17:36:54

+0

嘗試在''rule'=>'isUnique','後面加''allowEmpty'=> false,'或''required'=> true,'。 – bancer 2010-07-15 01:07:46

回答

5

的「isUnique設置」規則會在其他行重複值。如果「isUnique」測試也是主鍵,那麼這會造成問題。因此,基於您的規則/上述模型,如果你看一下SQL轉儲運行規則時,你可能會看到類似

SELECT COUNT(*) FROM users WHERE username = 'x' AND username != 'x' 

這顯然返回0或在測試中「獨一無二」。修復的方法是將主鍵設置爲與您正在測試規則的字段不同。當你這樣做時,SQL轉儲應該顯示類似

SELECT COUNT(*) FROM users WHERE username = 'x' AND key != 'y' 

這將返回> 0時,該字段不是唯一的,並且所需的功能將被恢復。

+0

你是對的,這解決了這個問題。謝謝。 – 2010-08-13 20:50:30

0

看着我的用戶模型,它看起來像這樣:

var $validate = array(
    'username' => array(
     'inUse' => array (
      'rule' => array('isUnique', 'username') 
     ) 
    ) 
) 
+0

它仍然無法正常工作。我很確定這個語法是正確的,因爲它適用於電子郵件領域(它也是它在book.cakephp.org上展示的方式)。現在我試圖找到其他的原因,阻止這個規則在一個領域工作,而不是爲另一個領域工作。 – 2010-07-16 07:21:22

3

我仍然無法找到是什麼問題,所以作爲臨時的解決方案我已經寫了一個自定義規則。如果別人需要這個:

var $validate = array(
    'username' => array(
     'isUnique' => array (
      'rule' => array('checkUniqueUser'), 
      'message' => 'This username already exists.' 
     ) 
    ) 
) 

function checkUniqueUser() { 
    return ($this->find('count', array('conditions' => array('User.username' => $this->data['User']['username']))) == 0); 
} 
-1

將$ this-> Form-> hidden('id')放置在您的表單中。它應該工作。

+0

這與這個問題有什麼關係?這將如何幫助? – vladko 2012-10-26 14:30:03

1

以下是如何在cakephp 2.3中使用isUnique valdiation規則。假設你有一個字段「用戶名」想要是唯一的,下面的代碼將會做到這一點。

'username' => array(
'notempty' => array(
'rule' => array('notempty'), 
'update' operations 
), 
'rule' => 'isUnique', 
'message' => 'User alread exists!' 
), 
相關問題