मेरा मानना है कि यह एक बेहतर समाधान है। कच्चे प्रश्नों जैसे leftJoin
. का उपयोग करने के बजाय आपको अपने joinWith
. का पूरक होना चाहिए andOnCondition
. के साथ संबंध (जो आपके जॉइन स्टेटमेंट में आवश्यक शर्तों को जोड़ता है)।
$products = Product::find()
->joinWith(['metaData' => function (ActiveQuery $query) {
return $query
->andWhere(['=', 'meta_data.published_state', 1]);
}])
->joinWith(['availability' => function (ActiveQuery $query) {
return $query
->andOnCondition(['>=', 'availability.start', strtotime('+7 days')])
->andWhere(['IS', 'availability.ID', NULL]);
}])
->all();
इसके अलावा जब आप where
write लिखते हैं तो यह साफ दिखता है संबंधों के अंदर खंड। यह वैसे ही काम करता है जैसे इसे बाहर लिखना (यदि मैं गलत नहीं हूं), लेकिन अपनी क्वेरी को दोबारा करते समय, आप बाहर की संबंध स्थितियों को भूले बिना आसानी से पूरे संबंध को हटा सकते हैं।