Mysql
 sql >> Base de données >  >> RDS >> Mysql

Yii2 - jointure gauche sur condition multiple

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.