Maison > Questions et réponses > le corps du texte
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粉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();