Acredito que esta seja a melhor solução. Em vez de usar consultas Raw como
leftJoin
você deve complementar seu joinWith
relações com andOnCondition
(que adiciona condições where necessárias em sua instrução de junção). $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();
Além disso, parece mais limpo quando você escreve
where
cláusulas dentro das relações. Funciona da mesma forma que escrevê-lo fora (se não estiver errado), mas ao refatorar sua consulta, você pode facilmente excluir toda a relação sem esquecer as condições da relação externa.