我有這個 SQL 查詢正在執行我想要的操作:
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')
我嘗試將其複製為 Yii 查詢產生器,如下所示:
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();
但我列印了此查詢產生器使用 getRawSql()
產生的 SQL,它以這種奇怪的方式傳回:
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')
抱歉,如果這樣讀起來很困難。
任何人都可以幫助我按照我想要的方式製作查詢產生器嗎?我將不勝感激
每當您使用
andWhere()
或orWhere()
時,查詢產生器都會採用現有條件並執行下列操作:或
分別。
因此,如果您已經遇到一些複雜的情況,然後嘗試致電
你將會得到
但就你而言,你需要得到類似的東西:
要獲得類似的結果,您可以以相同的方式建立第一個複雜條件,但必須在一個
orWhere()
呼叫中建立第二個條件。或者為了使其更具可讀性,您可以在單一呼叫中分別建立兩個複雜的條件: