Je crois que celui-ci est une meilleure solution. Au lieu d'utiliser des requêtes brutes comme leftJoin vous devez compléter votre joinWith relations avec andOnCondition (qui ajoute les conditions where nécessaires dans votre déclaration de jointure).
$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();
De plus, il semble plus propre lorsque vous écrivez where clauses à l'intérieur des relations. Cela fonctionne de la même manière que de l'écrire à l'extérieur (si je ne me trompe pas), mais lors de la refactorisation de votre requête, vous pouvez facilement supprimer toute la relation sans oublier les conditions de relation à l'extérieur.