一個簡單的查詢,類似下面的人會surficed,只要你有兩個表之間的簡單關係:
$classType = OfferedClassTypesQuery::create()
->useClassDatesQuery()
->filterByPk(160)
->endUse()
->filterByXXX(YYY)
...
->find();`
的複雜之處在於,你有一個以上的連接條件,並且這些條件在查詢之前是未知的。
至少有兩種方法可供選擇。
方案一:
寫您的原始的SQL查詢,並運行它對着你的數據庫連接,然後手動水合物適當的對象/類包裝類似下面的結果集:
$oConn = Propel::getConnection();
$sSQL = 'SELECT OfferedClassTypes.* FROM ...';
$oStm = $oCnon->prepare($sSQL);
$oFormatter = new PropelObjectFormatter();
// Here you put the class that exactly matches the results set
$oFormatter->setClass('OfferedClassTypes');
$classType = $oFormatter->format($oStm);
注意OfferedClassTypes.*
,因爲您只需要該表中的列,以便您可以通過匹配對象進行水合作用
選項二:
把你的原始SQL查詢到視圖,報價:
Propel custom sql for view tables
所以你也許像這樣定義自己的看法:
CREATE VIEW ViewOfferedClassTypes AS
SELECT
ClassDates.ID as ClassDateID,
OfferedClassTypes.*
...
然後在你的模式你有:
<table
name="ViewOfferedClassTypes"
phpName="ViewOfferedClassTypes"
readOnly="true"
skipSql="true">
... // Columns from the OfferedClassTypes table
<column name="ClassDateID" ... /> // Column from the ClassDates table
</table>
注意ClassDateID
列,因此您可以在過濾器中使用:
$classType = ViewOfferedClassTypesQuery::create()
->filterByClassDateID(160)
->find();
選項1是快速和骯髒的,而選項2是更復雜但更清潔/更有條理。
我希望這會有所幫助,祝你好運。
你的問題是什麼? – starkeen
我想運行這兩個查詢作爲一個 – Osman
我不能完全可視化你的表結構,但在你最後的查詢中,嘗試一個'useClassSessionsQuery() - > filterBy ...-> endUse()'。中間的過濾器(儘可能多)將放在ClassSessions模型的上下文中。我猜你需要一個'IN'過濾器嗎? – halfer