Credo che questa sia una soluzione migliore. Invece di usare query Raw come leftJoin
dovresti completare il tuo joinWith
relazioni con andOnCondition
(che aggiunge le condizioni necessarie nella tua dichiarazione di adesione).
$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();
Inoltre sembra più pulito quando scrivi where
clausole all'interno delle relazioni. Funziona come scriverlo all'esterno (se non sbaglio), ma durante il refactoring della query, puoi facilmente eliminare l'intera relazione senza dimenticare le condizioni della relazione all'esterno.