sql >> Base de Datos >  >> RDS >> Mysql

Yii2 - combinación izquierda en múltiples condiciones

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.