खोज…


टिप्पणियों

जब आप एक या अधिक रिकॉर्ड क्रमिक रूप से हटाना, अपडेट या बनाना चाहते हैं तो AR एकदम सही है। गंदे गुणों का इसका समर्थन (केवल वास्तव में क्या बदला गया था) को बचाने के परिणामस्वरूप अनुकूलित विवरण दिए गए हैं जो डेटाबेस से लोड को महत्वपूर्ण रूप से बढ़ाता है और एक ही समय में कई व्यक्तियों द्वारा एक ही रिकॉर्ड को संपादित करने से जुड़े विभिन्न संघर्षों की संभावना को कम करता है।

यदि आपके पास अपने आवेदन में वास्तव में जटिल तर्क नहीं है और इसलिए इसे अमूर्त संस्थाओं की आवश्यकता नहीं है, तो एआर डिलीट, अपडेट और अपडेट के लिए सबसे उपयुक्त है।

एआर भी सरल प्रश्नों के लिए ठीक है, जिसके परिणामस्वरूप प्रति पृष्ठ 100 रिकॉर्ड हैं। यह क्वेरी बिल्डर या asArray () द्वारा उत्पादित सरणियों के साथ काम करने के रूप में प्रदर्शन करने वाला नहीं है, लेकिन इसके साथ काम करने में अधिक खुशी है।

जटिल प्रश्नों के लिए AR की अनुशंसा नहीं की जाती है। ये आम तौर पर डेटा को एकत्र करने या बदलने के बारे में होते हैं, इसलिए जो भी लौटाया जाता है वह एआर मॉडल को वैसे भी फिट नहीं करता है। इस मामले में क्वेरी बिल्डर का उपयोग करना बेहतर है।

समान आयात और निर्यात के लिए जाता है। डेटा की उच्च मात्रा और संभवतः जटिल प्रश्नों के कारण क्वेरी बिल्डर का उपयोग करना बेहतर है।

सभी रिकॉर्ड का पता लगाएं

Post::find()->all();
// SELECT * FROM post

या आशुलिपि

(प्राथमिक कुंजी या स्तंभ मानों की एक सरणी द्वारा एक सक्रिय रिकॉर्ड मॉडल उदाहरण देता है।)

Post::findAll(condition);

ActiveRecord इंस्टेंस की एक सरणी देता है।

सभी को किस शर्त के साथ खोजें

$model = User::find()
        ->where(['id' => $id])
        ->andWhere('status = :status', [':status' => $status])
        ->all();

आदेश के साथ सभी खोजें

$model = User::find()
         ->orderBy(['id'=>SORT_DESC])
        ->all();
Or

$model = User::find()
         ->orderBy(['id'=>SORT_ASC])
        ->all();

कहां कारण

ऑपरेटरों

$postsGreaterThan = Post::find()->where(['>', 'created_at', '2016-01-25'])->all();
// SELECT * FROM post WHERE created_at > '2016-01-25'

$postsLessThan = Post::find()->where(['<', 'created_at', '2016-01-25'])->all();
// SELECT * FROM post WHERE created_at < '2016-01-25'

$postsNotEqual = Post::find()->where(['<>', 'created_at', '2016-01-25'])->all();
// SELECT * FROM post WHERE created_at <> '2016-01-25'

में

$postsInArray = Post::find()->where(['id' => [1,2,3]])->all();
// SELECT * FROM post WHERE id IN (1,2,3)

के बीच

$postsInBetween = Post::find()
->where(['between', 'date', "2015-06-21", "2015-06-27" ])
->all();

शून्य

$postsWithNullTitle = Post::find()->where(['title' => null]);
// SELECT * FROM post WHERE title IS NULL

तथा

$postsAND = Post::find()->where(['title' => null, 'body' => null]);
// SELECT * FROM post WHERE title IS NULL AND body IS NULL

या

$postsAND = Post::find()->where(['OR', 'title IS NULL', 'body IS NULL']);
// SELECT * FROM post WHERE title IS NULL OR body IS NULL

नहीं

 $postsNotEqual = Post::find()->where(['NOT', ['created_at'=>'2016-01-25']])->all();
// SELECT * FROM post WHERE created_at IS NOT '2016-01-25'

नेस्टेड क्लासेस

$postsNestedWhere = Post::find()->andWhere([
    'or',
    ['title' => null],
    ['body' => null]
])->orWhere([
    'and',
    ['not', ['title' => null]],
    ['body' => null]
]);
// SELECT * FROM post WHERE (title IS NULL OR body IS NULL) OR (title IS NOT NULL AND body IS NULL)

फ़िल्टर ऑपरेटर को एक्टीवेकॉर्ड तरीकों से चुनें

उदाहरण के लिए, खोज फ़िल्टर में आप वर्तमान उपयोगकर्ता द्वारा लॉग किए गए पोस्ट शीर्षक या विवरण का पता लगाकर पोस्ट को फ़िल्टर करना चाहते हैं।

$title = 'test';
$description = 'test';

i) और फ़िल्टरवेअर ()

$postLIKE = Post::find()->where(['user_id' => Yii::$app->user->getId()])->andfilterWhere(['or', ['title' => $title, 'description' => $description]])->all();
//SELECT * FROM post WHERE user_id = 2 AND ((`title` LIKE '%test%') OR (`description` LIKE '%test%'))

ii) या फ़िल्टरवेअर ()

$postLIKE = Post::find()->where(['user_id' => Yii::$app->user->getId()])->orFilterWhere(['or', ['title' => $title, 'description' => $description]])->all();
//SELECT * FROM post WHERE user_id = 2 OR ((`title` LIKE '%test%') OR (`description` LIKE '%test%'))

iii) फ़िल्टरवेयर ()

$postLIKE = Post::find()->filterWhere(['AND', ['title' => $title, 'description' => $description]])->andWhere(['user_id' => Yii::$app->user->getId()])->all();
//SELECT * FROM post WHERE ((`title` LIKE '%test%') AND (`description` LIKE '%test%')) AND user_id = 2

नोट: फ़िल्टरवेयर का उपयोग करते समय () हमें फ़िल्टर करने के बाद सभी जगह (और) या (या) () को कॉल करना होगा (अन्यथा) जहां सभी शर्तों को हटा दिया जाएगा फ़िल्टर को छोड़कर ()

फ़ील्ड आधारित मान वाली घटनाओं के साथ एक ActiveRecord वर्ग बनाएँ

    <?php
    namespace models;

    use yii\db\ActiveRecord;
    use yii\behaviors\TimestampBehavior;

    class Post extends ActiveRecord
    {
        public static function tableName()
        {
            return 'post';
        }

        public function rules() {
            return [
                [['created_at', 'updated_at'], 'safe'],
            ];
        }
        public function behaviors() {
            parent::behaviors();
    
            return [
              'timestamp' => [
                'class' => TimestampBehavior::className(),
                'attributes' => [
                  ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
                  ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at']
                ],
                'value' => date('Y-m-d H:i:s'),
              ]
            ];
          }
    }

या इसका उपयोग किया जा सकता है

public function beforeSave($insert)
{
    if($this->isNewRecord){
        //When create    
    }else{
         //When update
    }

    return parent::beforeSave($insert);
}

  public function afterSave($insert, $changedAttributes )
{
    if($insert){
        //When create    
    }else{
         //When update
    }
    return parent::afterSave($insert, $changedAttributes);
}

एक रिकॉर्ड खोजें

$customer = Customer::findOne(10);

या

$customer = Customer::find()->where(['id' => 10])->one();

या

$customer = Customer::find()->select('name,age')->where(['id' => 10])->one();

या

$customer = Customer::findOne(['age' => 30, 'status' => 1]);

या

$customer = Customer::find()->where(['age' => 30, 'status' => 1])->one();

वन क्वेरीज़ खोजें

आईडी के आधार पर एकल रिकॉर्ड का पता लगाएं।

$model = User::findOne($id);

आईडी के आधार पर सिंगल कॉलम चुनें।

$model = User::findOne($id)->name;

स्थिति के आधार पर डेटाबेस से एकल रिकॉर्ड प्राप्त करें।

$model = User::find()->one();  // give first record

$model = User::find()->where(['id' => 2])->one(); // give single record based on id

स्थिति के आधार पर डेटाबेस से एकल कॉलम रिकॉर्ड का चयन करें।

$model = User::find()->select('name,email_id')->where(['id' => 1])->one();

या

$model = User::find()->select(['id','name','email_id'])->where(['id' => 1])->one();

द्वारा आदेश

$model = User::find()->select(['id','name','email_id'])->orderBy(['id' => SORT_DESC])->one();

OR 

$model = User::find()->select(['id','name','email_id'])->orderBy(['id' => SORT_ASC])->one();

उप प्रश्नों के साथ सक्रिय रिकॉर्ड

उदाहरण: जो ग्राहक एक पोस्ट बना सकते हैं। प्रत्येक ग्राहक कई पोस्ट बना सकता है। जैसे ही ग्राहक पोस्ट बनाता है, पोस्ट एडमिनिस्ट्रेटर रिव्यू के तहत होगा। अब हमें उन ग्राहकों की सूची प्राप्त करनी होगी जिनके पास सब-क्वेरी का उपयोग करके सभी सक्रिय पोस्ट हैं।

नोट: यदि किसी ग्राहक के पास ५ पद हैं, तो ५ पदों में से यदि उसके पास कम से कम एक निष्क्रिय है, तो हमें इस ग्राहक को ग्राहकों की सूची से बाहर करना होगा।

$subQuery = Post::find()->select(['customer_id'])->where(['status' => 2]); //fetch the customers whos posts are inactive - subquery
$query = Customer::find()->where(['NOT IN', 'id', $subQuery])->all(); //Exclude the customers whos posts are inactive by using subquery


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow