Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Yii2 - junção esquerda em condição múltipla


Acredito que esta seja a melhor solução. Em vez de usar consultas Raw como leftJoin você deve complementar seu joinWith relações com andOnCondition (que adiciona condições where necessárias em sua instrução de junção).
$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();

Além disso, parece mais limpo quando você escreve where cláusulas dentro das relações. Funciona da mesma forma que escrevê-lo fora (se não estiver errado), mas ao refatorar sua consulta, você pode facilmente excluir toda a relação sem esquecer as condições da relação externa.