Creo que esta es una mejor solución. En lugar de usar consultas sin formato como leftJoin
deberías complementar tu joinWith
relaciones con andOnCondition
(que agrega las condiciones necesarias en su declaración de unión).
$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();
Además, se ve más limpio cuando escribes where
cláusulas dentro de relaciones. Funciona igual que escribirlo fuera (si no me equivoco), pero al refactorizar su consulta, puede eliminar fácilmente toda la relación sin olvidar las condiciones de la relación fuera.