2015-02-16 7 views
10

दृश्य में Yii2 का उपयोग करना ...Yii2 मॉडल :: लगता है() डिफ़ॉल्ट के साथ जहां स्थिति

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

रिटर्न सरणी के रूप में सभी उत्पादों। मैं इसे सभी उत्पादों को वापस करने के लिए एक तरीका ढूंढ रहा हूं, जहां आईडी! = 1 मैं केवल एक ही स्थान को संशोधित करना चाहता हूं जो प्रत्येक मॉडल के लिए "-> all()" लौटाता है। मुझे पता है कि Product::find()->where('id != 1')->... संभव है, लेकिन मैं इसे एक से अधिक स्थानों में लिखना और बनाए रखना नहीं चाहता हूं।

उत्तर

22

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 कथन में स्थिति निर्दिष्ट करने के विभिन्न तरीकों को देखें।

+0

मैं एक संबंधित सवाल है [यहां] (http://stackoverflow.com/q/31434768/57091)। – robsch

+3

पहले उदाहरण के साथ, अपने कोड में कहीं और 'जहां() 'अन्य जगहों का उपयोग करना - उदा। 'उत्पाद :: ढूंढें() -> जहां (['col' => $ value]) -> सभी(); 'मॉडल में आपके' डिफ़ॉल्ट '' कहां()' को ओवरराइट करेगा। दूसरे उदाहरण में स्कोप क्लास का उपयोग करने के अलावा, इसके आसपास कोई रास्ता है? – JamesG

+1

@JamesG 'जहां() पहले से परिभाषित किया गया है, आपको प्रारंभिक स्थिति रखने के लिए' और कहां() '/' orWhere() 'का उपयोग करने की आवश्यकता है। – arogachev

संबंधित मुद्दे