1) आप बस अपने मॉडल में find()
विधि ओवरराइड कर सकते हैं:
/**
* @return \yii\db\ActiveQuery
*/
public static function find()
{
return parent::find()->where(['<>', 'id', 1]);
}
उपयोग:
$products = Products::find()->all();
2) उपयोग scope।
कस्टम क्वेरी वर्ग बनाएँ:
namespace app\models;
use yii\db\ActiveQuery;
class ProductQuery extends ActiveQuery
{
public function withoutFirst()
{
$this->andWhere(['<>', 'id', 1]);
return $this;
}
}
अवहेलना अपने मॉडल में find()
विधि:
namespace app\models;
use yii\db\ActiveRecord;
class Product extends ActiveRecord
{
/**
* @inheritdoc
* @return ProductQuery
*/
public static function find()
{
return new ProductQuery(get_called_class());
}
}
तो फिर तुम इसे इस तरह उपयोग कर सकते हैं:
$products = Products::find()->withoutFirst()->all();
मैं दूसरी विधि का उपयोग कर लगता है अधिक लचीला है, क्योंकि यह कोड को और स्पष्ट करता है।
अतिरिक्त नोट्स:
हार्डकोडेड id
अच्छा अभ्यास नहीं है। इसके बराबर स्थिति के साथ बेहतर जगह।
इस उदाहरण के लिए मैंने शर्त निर्दिष्ट करने के विभिन्न तरीके का उपयोग किया। official documentation में where
कथन में स्थिति निर्दिष्ट करने के विभिन्न तरीकों को देखें।
मैं एक संबंधित सवाल है [यहां] (http://stackoverflow.com/q/31434768/57091)। – robsch
पहले उदाहरण के साथ, अपने कोड में कहीं और 'जहां() 'अन्य जगहों का उपयोग करना - उदा। 'उत्पाद :: ढूंढें() -> जहां (['col' => $ value]) -> सभी(); 'मॉडल में आपके' डिफ़ॉल्ट '' कहां()' को ओवरराइट करेगा। दूसरे उदाहरण में स्कोप क्लास का उपयोग करने के अलावा, इसके आसपास कोई रास्ता है? – JamesG
@JamesG 'जहां() पहले से परिभाषित किया गया है, आपको प्रारंभिक स्थिति रखने के लिए' और कहां() '/' orWhere() 'का उपयोग करने की आवश्यकता है। – arogachev