2

我有两张桌子。一个用于订单和他们的偏好。表格如下所示:

订购

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

订单偏好

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

我想要的是对于每个订单,获取prefValue特定的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;
        }
    }
}

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

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

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

2 回答 2

1

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

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

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

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

于 2013-05-13T22:19:22.103 回答
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()部分 - 它只是为了没有得到完全膨胀/水合的对象,但实际上只有一个包含您需要的 prefValue 数据的数组(准确地说是 PropelArrayCollection)。

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

于 2013-10-01T16:31:39.143 回答