Comment écrire cette requête SQL à l'aide de Yii Query Builder
P粉990568283
P粉990568283 2024-04-01 21:29:26
0
1
499

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粉990568283
P粉990568283

répondre à tous(1)
P粉596191963

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],
        ['orWhere([
        'AND',
        ['Table1.idOwner' => $idOwner, 'Table2.enabled' => 1],
        ['!=', "date_format(Table2.creationDate, '%Y-%m')", $currentExpirationMonthYear],
        ['!=', "date_format(Table2.creationDate, '%Y-%m')", $previousExpirationMonthYear]
    ])->all();
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal