2017-06-06 36 views
3

在Yii2我有我的數據庫中的兩個字段:emailshopIdyii2獨特的驗證,只有當字段不爲空

  • EmailshopIdunique在一起
  • Email也可以emptyNULL),而shopId總是一個整數

這些是我在模型中的規則:

[['email'],'default','value' => NULL], 
[['shopId'], 'integer'], 
[['email','shopId'], 'unique', 'targetAttribute' => ['email', 'shopId'], 'message' => 'Already taken!'], 

這是行不通的,當我有兩個條目與例如email="NULL"shopId="1"

我該如何解決這個問題?

+0

嗨。您可以通過將'email'和'shopId'設置爲連接的唯一鍵來解決數據庫端的問題。確切的說法取決於您的DBMS。 –

+1

用戶'when'條件http://www.yiiframework.com/doc-2.0/guide-input-validation.html#conditional-validation – SiZE

+0

謝謝,當條件工作。由於來自Yii2的模型驗證在 – kasoft

回答

0

我使用的條件時,該規則中

[ 
    ['email', 'shopId'], 
    'unique', 
    'targetAttribute' => ['email', 'shopId'], 
    'message' => 'Diese E-Mail Adresse ist bereits registriert!', 
    'when' => function ($model) { 
     return !empty($model->email); 
    } 
], 
1

當您的解決方案的工作是不是技術上是正確的。 驗證規則

[['email','shopId'], 'unique', 'targetAttribute' => ['email', 'shopId']] 

將驗證email要與shopId如果給email不爲空(所需的功能)唯一的,但它也將驗證shopId是具有獨特email如果給shopId不是空的(不必要的)。您正在通過對數據庫的兩個查詢驗證兩個字段。

符合您需求

有效性規則

[['email'], 'unique', 'targetAttribute' => ['email', 'shopId']] 

說:「如果email不爲空,檢查的emailshopId組合是唯一和綁定結果email屬性」。