2017-06-06 3 views
3

In Yii2 Ich habe zwei Felder in meiner Datenbank: email und shopIdyii2 einzigartige Prüfung nur, wenn Feld nicht leer

  • Email und shopId sollte unique zusammen
  • Email seine auch empty (NULL) während shopId sein könnte ist immer eine ganze Zahl

Dies sind meine Regeln im Modell:

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

Dies funktioniert nicht, wenn ich zwei Einträge mit z. email="NULL" und shopId="1".

Wie kann ich das lösen?

+0

Hallo. Sie können dies auf der DB-Seite lösen, indem Sie 'email' und' shopId' als verbundenen eindeutigen Schlüssel setzen. Die genaue Aussage dafür hängt von Ihrem DBMS ab. –

+1

Benutzer 'when' Bedingung http://www.yiiframework.com/doc-2.0/guide-input-validation.html#conditional-validation – SiZE

+0

Danke, die wann Bedingung funktionierte. Ich kann das nicht auf DBMS Side lösen, da die Modellvalidierung von Yii2 vor – kasoft

Antwort

0

verwenden ich die, wenn die Bedingung in der Regel

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

Während Ihre Lösung funktioniert es technisch nicht korrekt ist. Gültigkeitsregel

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

wird email bestätigen Sie mit der gegebenen shopId eindeutig zu sein, wenn email nicht leer ist (gewünschte Funktionalität), aber es wird auch shopId bestätigen Sie mit der gegebenen email eindeutig zu sein, wenn shopId nicht leer ist (unerwünschte). Sie validieren zwei Felder mit zwei Abfragen an die DB.

Prüfungsregel, die Ihren Bedürfnissen passt, ist

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

sagen: „Wenn email nicht leer ist, prüfen Sie, ob Kombination von email und shopId ist einzigartig und binden Ergebnis email Attribut“.

Verwandte Themen