2015-02-16 16 views
10
View Yii2 kullanma

...Yii2 modeli :: (bulmak) varsayılan nerede koşullar

Products::find()->asArray()->all() 

döner dizi olarak tüm ürünler. Tüm ürünleri iade etmenin bir yolunu arıyorum WHERE id! = 1 Sadece tek bir yere sahip olmak istiyorum, her model için ne "-> all()" döndürür. Product::find()->where('id != 1')->...'un mümkün olduğunu biliyorum, ancak bunu birden fazla yerde yazmak ve sürdürmek istemiyorum.

cevap

22

1) Siz sadece modelinde find() yöntemi geçersiz kılabilirsiniz:

/** 
* @return \yii\db\ActiveQuery 
*/ 
public static function find() 
{ 
    return parent::find()->where(['<>', 'id', 1]); 
} 

Kullanımı:

$products = Products::find()->all(); 

2) kullanın scope.

özel sorgu sınıf oluşturun:

namespace app\models; 

use yii\db\ActiveRecord; 

class Product extends ActiveRecord 
{ 
    /** 
    * @inheritdoc 
    * @return ProductQuery 
    */ 
    public static function find() 
    { 
     return new ProductQuery(get_called_class()); 
    } 
} 

Sonra bu gibi kullanabilirsiniz:

$products = Products::find()->withoutFirst()->all(); 

Ben ikinci yöntemi kullanarak düşünüyorum Modelinizdeki find() yöntem

namespace app\models; 

use yii\db\ActiveQuery; 

class ProductQuery extends ActiveQuery 
{ 
    public function withoutFirst() 
    { 
     $this->andWhere(['<>', 'id', 1]); 

     return $this; 
    } 
} 

Override daha esnektir, çünkü kodu daha net yapar.

ek notlar:

  • Hardcoded id iyi bir uygulama değildir. Eşdeğer koşulu ile değiştirin.

  • Bu örnekte, durumu belirtmenin farklı bir yolunu kullandım. official documentation adresindeki where ifadesindeki koşulu belirtmenin farklı yollarını inceleyin.

+0

İlgili bir sorum var [burada] (http://stackoverflow.com/q/31434768/57091). – robsch

+3

İlk örnekte, kodunuzun başka bir yerinde 'where()' kullanarak - ör. 'Ürün :: find() -> nerede (['col' => $ value]) -> all();' modelin 'varsayılan' 'where()' üzerine yazacaktır. İkinci örnekte kapsam sınıfını kullanmanın dışında bunun bir yolu var mı? – JamesG

+1

@JamesG 'where()' ile önceden tanımlanmış ve başlangıç ​​koşulunu korumak için 'veWhere()'/'veyaWhere()' yi kullanmanız gerekir. – arogachev