Věřím, že toto je lepší řešení. Místo použití nezpracovaných dotazů jako leftJoin měli byste doplnit svůj joinWith vztahy s andOnCondition (což přidá potřebné podmínky do vašeho příkazu spojení).
$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();
Navíc to vypadá čistěji, když napíšete where klauzule uvnitř vztahů. Funguje to stejně jako psaní venku (pokud se nepletu), ale při refaktorování vašeho dotazu můžete snadno smazat celý vztah, aniž byste zapomněli podmínky vztahu venku.