在PropelCollection中查找特定行

时间:2013-05-13 21:53:54

标签: php mysql propel

我有两张桌子。一个用于订单,也用于他们的首选项。表格如下所示:

顺序

+----------+---------------+------------+
| 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的{​​{1}}。目前,这就是我在做的事情:

prefID

这样可行,但需要有一种更好的方法来获取每个订单所需的一行,而不需要遍历所有的首选项。

我知道这不起作用,但有这样的东西吗?

$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;
        }
    }
}

我正在阅读文档并找到->search()方法,但我不知道如何使用它。

$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();
}

2 个答案:

答案 0 :(得分:1)

看看我写过的一些旧的Propel东西,我猜的是:

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

问题是您需要获取特定列(reference)。

对于这些可链接的查询,我认为自动完成编辑器几乎是强制性的 - 如果没有它,记住语法几乎是不可能的。

答案 1 :(得分: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中执行任何操作,也不需要分两步完成。 关于->select()部分 - 它只是没有得到完全膨胀/水合的对象,但实际上只有一个数组(PropelArrayCollection准确)与你需要的prefValue数据。

我没有测试这个,但可能会出现一些语法问题。