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.
İlgili bir sorum var [burada] (http://stackoverflow.com/q/31434768/57091). – robsch
İ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
@JamesG 'where()' ile önceden tanımlanmış ve başlangıç koşulunu korumak için 'veWhere()'/'veyaWhere()' yi kullanmanız gerekir. – arogachev