Uważam, że to jest lepsze rozwiązanie. Zamiast używać surowych zapytań, takich jak leftJoin
powinieneś uzupełnić swoje joinWith
relacje z andOnCondition
(co dodaje potrzebne warunki gdzie do oświadczenia dołączenia).
$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();
Ponadto wygląda czyściej, gdy piszesz where
klauzule wewnątrz relacji. Działa to tak samo, jak pisanie go na zewnątrz (jeśli się nie mylę), ale podczas refaktoryzacji zapytania możesz łatwo usunąć całą relację, nie zapominając o warunkach relacji na zewnątrz.