Maison  >  Questions et réponses  >  le corps du texte

Comment écrire cette requête SQL à l'aide de Yii Query Builder

J'ai cette requête SQL qui fait ce que je veux :

SELECT `Table1`.* FROM `Table1` 
LEFT JOIN `Table2` ON `Table1`.`idTable2` = `Table2`.`id` 
WHERE (`Table1`.`idOwner`=156 AND `Table2`.`enabled`=1 AND day(Table2.creationDate) <= 5 AND date_format(Table2.creationDate, '%Y-%m') = '2022-12') 
OR (`Table1`.`idOwner`=156 AND `Table2`.`enabled`=1 AND date_format(Table2.creationDate, '%Y-%m') != '2023-01' AND date_format(Table2.creationDate, '%Y-%m') != '2022-12')

J'ai essayé de le copier en tant que générateur de requêtes Yii comme ceci :

Table1::find()
   ->joinWith(['table2'])
   ->where(['Table1.idOwner' => $idOwner, 'Table2.enabled' => 1])
   ->andWhere(['<=', 'day(Table2.creationDate)', $expirationDay])
   ->andWhere(['=', "date_format(Table2.creationDate, '%Y-%m')", $previousExpirationMonthYear])
   ->orWhere(['Table1.idOwner' => $idOwner, 'Table2.enabled' => 1])
   ->andWhere(['!=', "date_format(Table2.creationDate, '%Y-%m')", $currentExpirationMonthYear])
   ->andWhere(['!=', "date_format(Table2.creationDate, '%Y-%m')", $previousExpirationMonthYear])
   ->all();

Mais j'ai imprimé le SQL généré par ce générateur de requêtes en utilisant getRawSql() et il est revenu de cette manière étrange :

SELECT `Table1`.* FROM `Table1` 
LEFT JOIN `Table2` ON `Table1`.`idTable2` = `Table2`.`id` 
WHERE (((((((`Table1`.`idOwner`=156) 
AND (`Table2`.`enabled`=1)) 
AND (day(Table2.creationDate) <= 5)) 
AND (date_format(Table2.creationDate, '%Y-%m') = '2022-12')) 
OR ((`Table1`.`idOwner`=156) 
AND (`Table2`.`enabled`=1))) 
AND (date_format(Table2.creationDate, '%Y-%m') != '2023-01')) 
AND (date_format(Table2.creationDate, '%Y-%m') != '2022-12')) 
AND (`Table1`.`idOwner`='156')

Désolé si c'est difficile à lire.

Quelqu'un peut-il m'aider à créer le générateur de requêtes comme je le souhaite ? Je serais reconnaissant

P粉990568283P粉990568283181 Il y a quelques jours361

répondre à tous(1)je répondrai

  • P粉596191963

    P粉5961919632024-04-02 19:22:21

    Chaque fois que vous utilisez andWhere()orWhere() , le générateur de requêtes prend les conditions existantes et fait quelque chose comme ceci :

    ou

    Respectivement.

    Donc, si vous avez été confronté à une situation compliquée, essayez d'appeler

    orWhere(new condition 1)
    ->andWhere(new condition 2)

    Vous obtiendrez

    Mais dans votre cas, vous devez obtenir quelque chose comme :

    Pour obtenir des résultats similaires, vous pouvez construire la première condition complexe de la même manière, mais la deuxième condition doit être construite en un seul orWhere() appel. Ou pour le rendre plus lisible, vous pouvez créer deux conditions complexes séparément en un seul appel :

    Table1::find()
        ->joinWith(['table2'])
        ->where([
            'AND',
            ['Table1.idOwner' => $idOwner, 'Table2.enabled' => 1],
            ['<=', 'day(Table2.creationDate)', $expirationDay],
            ['=', "date_format(Table2.creationDate, '%Y-%m')", $previousExpirationMonthYear]
        ])->orWhere([
            'AND',
            ['Table1.idOwner' => $idOwner, 'Table2.enabled' => 1],
            ['!=', "date_format(Table2.creationDate, '%Y-%m')", $currentExpirationMonthYear],
            ['!=', "date_format(Table2.creationDate, '%Y-%m')", $previousExpirationMonthYear]
        ])->all();
    

    répondre
    0
  • Annulerrépondre