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.