2012-03-12 16 views

cevap

48

, bunun için bir uzantısı gerekmez bu rules ekleyebilir olabilir. burada tarif edildiği gibi bir uzantısı rules() yöntemi temizlik yardımcı olabilir Ancak In: ​​

public function rules() { 
    return array(
     array('firstKey', 'unique', 'criteria'=>array(
      'condition'=>'`secondKey`=:secondKey', 
      'params'=>array(
       ':secondKey'=>$this->secondKey 
      ) 
     )), 
    ); 
} 

:

http://www.yiiframework.com/extension/unique-attributes-validator/

Bu uzantı kullanmadan çalışır (bu sitede kopyalanmış) kodudur $this->secondKey'un değeri rules() -method içinde kullanılamaz. Değerleme değerini CActiveRecords beforeValidate() -method'a ekleyebilirsiniz:

public function beforeValidate() 
{ 
    if (parent::beforeValidate()) { 

     $validator = CValidator::createValidator('unique', $this, 'firstKey', array(
      'criteria' => array(
       'condition'=>'`secondKey`=:secondKey', 
       'params'=>array(
        ':secondKey'=>$this->secondKey 
       ) 
      ) 
     )); 
     $this->getValidatorList()->insertAt(0, $validator); 

     return true; 
    } 
    return false; 
} 
+0

Bu yöntemi denedim, ancak "$ this-> secondKey" – Khaleel

+0

"$ this-> secondKey" değerinin benzersiz olması gereken ikinci özellik olması gereken değeri almıyorum. Bunu özellik adınıza göre ayarlamanız gerekir. – cebe

+0

bunu biliyorum. Öznitelik adımı denedim. Ben sadece '' ( – Khaleel

-5

kodunuzda üzerine

Bu yii kendisi tarafından yapılabilir
return array(
    array('name', 'unique', 'className'=>'MyModel', 'attributeName'=>'myName'), 
    array('version', 'unique', 'className'=>'MyModel', 'attributeName'=>'myVersion') 
); 
+3

Bu yalnızca bu ismi benzersizdir doğrular ve sürüm yalnız tektir,

Öyle gibi kullanabilirsiniz sizin ActiveRecord Modeli üzerine ekleyeceğiniz bir fonksiyonudur . '(isim, sürüm) 'sütun çiftini doğrulamaz. – cebe

7

Karmaşık içerik() yöntemine veya 3. taraf uzantılarına ihtiyacınız yoktur. Sadece kendi doğrulama yönteminizi oluşturun. Bunu kendi başına yapmak çok daha kolay.

public function rules() 
{ 
    return array(
    array('firstField', 'myTestUniqueMethod'), 
); 
} 

public function myTestUniqueMethod($attribute,$params) 
{ 

    //... and here your own pure SQL or ActiveRecord test .. 
    // usage: 
    // $this->firstField; 
    // $this->secondField; 
    // SELECT * FROM myTable WHERE firstField = $this->firstField AND secondField = $this->secondField ... 
    // If result not empty ... error 

    if (!$isUnique) 
    { 
    $this->addError('firstField', "Text of error"); 
    $this->addError('secondField', "Text of error"); 
    } 

} 
+0

+1 Basit ve kolay :) – AlphaMale

4

Onlar Yii1.14rc sonraki sürümü aday benzersiz kompozit tuşları desteği eklendi, ama burada (henüz başka) çözümü ettik. BTW, bu kod, Yii çerçevesinin bir sonraki resmi sürümde kullanacağı kurallarda aynı 'attributeName' kullanır.

korumalı/modeller/kural başında Mymodel.php

public function rules() 
    { 
     return array(
      array('name', 'uniqueValidator','attributeName'=>array(
       'name', 'phone_number','email') 
     ), 
... 
  • 'adı' formunuzda doğrulama hatası eklenecektir nitelik ve sonraki çıkıştır.
  • 'attributeName' (array), birleştirilmiş anahtar olarak birlikte doğrulamak istediğiniz bir dizi anahtar içerir.

korumalı/bileşenleri/doğrulayıcılar/uniqueValidator.php

class uniqueValidator extends CValidator 
    { 
     public $attributeName; 
     public $quiet = false; //future bool for quiet validation error -->not complete 
    /** 
    * Validates the attribute of the object. 
    * If there is any error, the error message is added to the object. 
    * @param CModel $object the object being validated 
    * @param string $attribute the attribute being validated 
    */ 
    protected function validateAttribute($object,$attribute) 
    { 
     // build criteria from attribute(s) using Yii CDbCriteria 
     $criteria=new CDbCriteria(); 
     foreach ($this->attributeName as $name) 
      $criteria->addSearchCondition($name, $object->$name, false ); 

     // use exists with $criteria to check if the supplied keys combined are unique 
     if ($object->exists($criteria)) { 
      $this->addError($object,$attribute, $object->label() .' ' . 
       $attribute .' "'. $object->$attribute . '" has already been taken.'); 
     } 
    } 

} 

İstediğiniz gibi birçok özellik kullanabilirsiniz ve bu CModels tümü için çalışacaktır. Kontrol "var" ile yapılır.

korumalı/config/Main.php

'application.components.validators.*', 

Sen uniqueValidator.php Yii uygulama tarafından bulunacaktır böylece 'ithal' dizisinde config yukarıdaki satır eklemeniz gerekebilir.

Olumlu geribildirim ve değişiklikler çok açığız!

+1

Hala yükseltmek için zamanım olmadı oldukça büyük bir uygulama için 1,13 hala yaşıyorum. Hızlı bir testten, bu harika çalışıyor, teşekkürler! Ayrıca, özel bir doğrulayıcı (zor değil, verilen ancak karışık olabilir) oluşturmayı ve bazı öznitelikleri ikinci öznitelik olarak dinamik bir değer geçirerek çözmeyi (_really_ dağınıklığı) önler. – ldg

-2

Çok kolay. Dizinizde, uzantı sınıfınızda oluşturulmuş bir param ekleyin.

Sonraki kod Modelin içinde.

array('name', 'ext.ValidateNames', 'with'=>'lastname') 

Sonraki kod uzantıları klasörüne sınıfından ValidateNames değil.

class ValidateNames extends CValidator 
{ 
    public $with=""; /*my parameter*/ 

    public function validateAttribute($object, $attribute) 
    { 
     $temp = $this->with; 
     $lastname = $object->$temp; 
     $name = $object->$attribute; 
     $this->addError($object,$attribute, $usuario." hola ".$lastname); 
    } 
} 
+1

Cevabınız, diğer cevaplardan en az bir tanesi tarafından sağlanmamış bilgiler içermiyor. –

3

Yii1:

http://www.yiiframework.com/extension/composite-unique-key-validatable/

Yii2: Yii2 olarak

// a1 needs to be unique 
['a1', 'unique'] 
// a1 needs to be unique, but column a2 will be used to check the uniqueness of the a1 value 
['a1', 'unique', 'targetAttribute' => 'a2'] 
// a1 and a2 need to be unique together, and they both will receive error message 
[['a1', 'a2'], 'unique', 'targetAttribute' => ['a1', 'a2']] 
// a1 and a2 need to be unique together, only a1 will receive error message 
['a1', 'unique', 'targetAttribute' => ['a1', 'a2']] 
// a1 needs to be unique by checking the uniqueness of both a2 and a3 (using a1 value) 
['a1', 'unique', 'targetAttribute' => ['a2', 'a1' => 'a3']] 

http://www.yiiframework.com/doc-2.0/yii-validators-uniquevalidator.html

3

:

public function rules() { 
    return [ 
     [['name'], 'unique', 'targetAttribute' => ['name', 'version']], 
    ]; 
} 
yukarıdaki fonksiyonu dayanarak
0

, burada

array(array('productname,productversion'), 'ValidateUniqueColumns', 'Product already contains that version'), 


/* 
* Validates the uniqueness of the attributes, multiple attributes 
*/ 
public function ValidateUniqueColumns($attributes, $params) 
{ 
    $columns = explode(",", $attributes); 
    //Create the SQL Statement 
    $select_criteria = ""; 
    $column_count = count($columns); 
    $lastcolumn = ""; 

    for($index=0; $index<$column_count; $index++) 
    { 
     $lastcolumn = $columns[$index]; 
     $value = Yii::app()->db->quoteValue($this->getAttribute($columns[$index])); 
     $column_equals = "`".$columns[$index]."` = ".$value.""; 
     $select_criteria = $select_criteria.$column_equals; 
     $select_criteria = $select_criteria." "; 
     if($index + 1 < $column_count) 
     { 
      $select_criteria = $select_criteria." AND "; 
     } 
    } 

    $select_criteria = $select_criteria." AND `".$this->getTableSchema()->primaryKey."` <> ".Yii::app()->db->quoteValue($this->getAttribute($this->getTableSchema()->primaryKey)).""; 

    $SQL = " SELECT COUNT(`".$this->getTableSchema()->primaryKey."`) AS COUNT_ FROM `".$this->tableName()."` WHERE ".$select_criteria; 

    $list = Yii::app()->db->createCommand($SQL)->queryAll(); 
    $total = intval($list[0]["COUNT_"]); 

    if($total > 0) 
    { 
     $this->addError($lastcolumn, $params[0]); 
     return false; 
    } 

    return true; 
} 
İlgili konular