2015-01-14 57 views
1

我有4個表:更好的Propel查詢語句

  1. branches(包含分支信息)
  2. offered_class_types(每個分支都有一套它可用類)
  3. class_sessions(每個類類型都有其會話,就像白天,傍晚,晚上)
  4. class_dates(每個日期對應一個會話)

所以我的流程:每個日期對應於一個會話(通過代碼,直接鏈接兩個),這對應於一個類型的兩件事1.分支ID和2.類名(分支可以提供相同的類類型,可以有相同的會話)。每個類的類型對應於使用與會話表對應的相同分支ID的分支表。

我想將此代碼轉換爲一個查詢,而不是現在的兩個。在切換到Propel之前,它只在一個查詢中。

$class = ClassDatesQuery::create()->findPk(160); 
$classSession = $class->getOfferedSessionsRelatedByCode(); 
$classType = OfferedClassTypesQuery::create() 
    ->filterByType($classSession->getClassname()) 
    ->filterByBranchid($classSession->getBranchid()) 
    ->find(); 
+0

你的問題是什麼? – starkeen

+0

我想運行這兩個查詢作爲一個 – Osman

+0

我不能完全可視化你的表結構,但在你最後的查詢中,嘗試一個'useClassSessionsQuery() - > filterBy ...-> endUse()'。中間的過濾器(儘可能多)將放在ClassSessions模型的上下文中。我猜你需要一個'IN'過濾器嗎? – halfer

回答

2

一個簡單的查詢,類似下面的人會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是更復雜但更清潔/更有條理。

我希望這會有所幫助,祝你好運。