Şu gibi bir tablom var: (kimlik, ad, sürüm, metin). (ad, sürüm) benzersiz bir anahtardır, bunu doğrulamak için nasıl bir kural yapabilirim.yii: iki öznitelik için benzersiz bir kural nasıl yapılır
cevap
, 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;
}
kodunuzda üzerine
Bu yii kendisi tarafından yapılabilirreturn array(
array('name', 'unique', 'className'=>'MyModel', 'attributeName'=>'myName'),
array('version', 'unique', 'className'=>'MyModel', 'attributeName'=>'myVersion')
);
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
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");
}
}
+1 Basit ve kolay :) – AlphaMale
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!
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
Ç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);
}
}
Cevabınız, diğer cevaplardan en az bir tanesi tarafından sağlanmamış bilgiler içermiyor. –
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
:
public function rules() {
return [
[['name'], 'unique', 'targetAttribute' => ['name', 'version']],
];
}
yukarıdaki fonksiyonu dayanarak
, 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;
}
- 1. İki öznitelik dizeyi bir UILabel'de nasıl birleştiririm?
- 2. Yii
- 3. Çift olarak "benzersiz" iki alan nasıl tanımlanır
- 4. Yii
- 5. İki sütunda benzersiz bir dizin nasıl uygulanır
- 6. laravel boş veya null hariç benzersiz kurallar nasıl yapılır
- 7. Yii durumundaki bir tablodan iki sütun DISTINCT nasıl seçilir?
- 8. PMD - Bir kural içinde bir kural nasıl devre dışı bırakılır?
- 9. Bir SQL deyiminde iki sütun nasıl yapılır
- 10. Nasıl yapılır .htaccess kural büyük/küçük harfe duyarlı değil mi?
- 11. Haskell: İki tipin bir örneği nasıl yapılır?
- 12. xcode/iPhone için kural oluşturma
- 13. Yii
- 14. Yii 2 bilinmeyen özelliği alınıyor: yii \ web \ Görünüm :: nitelik
- 15. Daha özel bir kural kullanmak için zorla
- 16. xml şemasında benzersiz bir özellik nasıl oluşturulur?
- 17. Php'de görüntüler (imgur.com gibi) için benzersiz bir url nasıl oluşturulur?
- 18. boto3 authorize_security_group_ingress'ı, iki güvenlik grubu arasında varsayılan olmayan VPC'de bir kural eklemek için nasıl kullanılır VPC
- 19. Arke dönüşüm Weka CSV: IllegalArgumentException: Öznitelik adlar benzersiz değil
- 20. Yii Framework HTTPS'yi kullanmak için nasıl yapılandırılır?
- 21. Bir dizi için Yii geçerlilik kuralları
- 22. Yii phpmailer gmail için çalışmıyor
- 23. Yii Boilerplate'i nasıl kurabilirim?
- 24. Oracle'da iki tablo için diğer adlarla birleştirme nasıl yapılır?
- 25. Yay entegrasyonu için iki makine talebinden nasıl senkronizasyon yapılır?
- 26. İki uyarının üstbilgileri IDL'de nasıl aynı yapılır?
- 27. Twig ile İki Sütun Tablo Nasıl Yapılır?
- 28. Gerçekten eşzamansız iki SQL sorgusu nasıl yapılır
- 29. Dosyadaki iki benzersiz kelimenin olası her çifti için, bu çiftin
- 30. İki tupl listesi derinlik karşılaştırması nasıl yapılır?
Bu yöntemi denedim, ancak "$ this-> secondKey" – Khaleel
"$ 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
bunu biliyorum. Öznitelik adımı denedim. Ben sadece '' ( – Khaleel