2013-05-13 25 views
2

我有兩個表。一個是訂單,一個是訂單。這些表是這樣的:查找PropelCollection中的特定行

訂購

+----------+---------------+------------+ 
| orderID | orderNumber | clientID | 
+----------+---------------+------------+ 
| 1  | abc123  |  2  | 
| 2  | orderX  |  7  | 
| 3  | Joe9  |  2  | 
| 4  | Order4  |  2  | 
+----------+---------------+------------+ 

OrderPref

+----------+----------+-------------+ 
| orderID | prefID | prefValue | 
+----------+----------+-------------+ 
| 1  | 1  | $100  | 
| 1  | 2  | 123  | 
| 1  | 3  | $35  | 
| 2  | 1  | $600  | 
| 2  | 2  | 876  | 
| 2  | 3  | $44  | 
+----------+----------+-------------+ 

我想是每一個訂單,得到prefValue特定什麼。目前,這是我在做什麼:

$orders = OrdersQuery::create()->filterByClientID(2)->find(); 

foreach($orders as $o){ 
    $prefs = $o->getOrderPrefs(); 

    foreach($prefs as $p){ 
     if($p->getPrefID() === 2){ 
      echo $p->getPrefValue(); 
      break; 
     } 
    } 
} 

這工作,但需要有一個更好的方式來獲得一個行我想每個訂單沒有通過所有的首選項循環。

我知道這不起作用,但有沒有這樣的事情?

$orders = OrdersQuery::create()->filterByClientID(2)->find(); 

foreach($orders as $o){ 
    // This obviously doesn't work, so is there a short way to do this? 
    echo $o->getOrderPrefs()->filterByPrefID(2)->getPrefValue(); 
} 

我讀的文檔,發現一個->search()方法,但我不知道如何使用它。

$orders = OrdersQuery::create()->filterByClientID(2)->find(); 

foreach($orders as $o){ 
    // How can I search for the row with the prefID I want? 
    echo $o->getOrderPrefs()->search()->getPrefValue(); 
} 

回答

1

看着一些舊的Propel的東西,我已經寫了,我猜是這樣的:

$prefValue = OrdersQuery::create()-> 
    joinOrderPref()-> 
    where('OrderPref.prefID = ?', $prefId)-> 
    filterByClientID($clientId)-> 
    select('OrderPref.prefValue')-> 
    find() 
; 

的問題是,你需要獲得一個特定的列(reference)。

對於這些可鏈接的查詢,我的觀點是自動完成編輯器非常強制 - 記住語法就近了 - 如果沒有它,就不可能了。

+0

問題是,這會返回給我'訂單',每個''getOrderPrefs'方法;現在我們又回到了最初的問題。我如何從這個查詢中獲得'prefValue'? – 2013-05-13 22:23:22

+0

啊好點 - 更新。 – halfer 2013-05-13 22:27:23

+0

那麼,最好的方法是預先選擇我想使用的列? – 2013-05-13 22:30:21

1
$prefValues = OrdersQuery::create() 
     ->filterByClientId(2) 
     ->joinOrderPref() 
     ->withColumn('OrderPref.PrefValue', 'theValue')  
     // row above fetches ONLY the needed column from joined table and 
     // gives 'theValue' alias to it 
     ->select('theValue') 
     ->find(); 

有了這個,你不需要做任何PHP或foreaches做的兩個步驟。 關於->select()的一部分 - 它只是沒有得到完全膨脹的/水合的對象,實際上只有一個數組(PropelArrayCollection是精確的)與你需要的prefValue數據。

雖然我沒有對此進行測試,但可能會出現一些語法問題。