我有两张桌子。一个用于订单,也用于他们的首选项。表格如下所示:
顺序:
+----------+---------------+------------+
| 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();
}
答案 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数据。
我没有测试这个,但可能会出现一些语法问题。