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.