gpt4 book ai didi

php - 推进 2 : Using a subquery as the value for a virtual column

转载 作者:可可西里 更新时间:2023-11-01 07:20:12 26 4
gpt4 key购买 nike

我们有一个包含所有产品的表格和一个包含所有订购商品的单独表格。订购的商品基本上是已订购产品的副本,与其源产品相关(通过外键)和仅与订购商品相关的附加数据,如订购数量。

通过这种方式,我们确保了订单数据的一致性,因为即使我们将来可能会删除旧产品,旧订单仍然以订单项的形式包含所有已订购的产品。订单和订单商品通过一个简单的交叉引用表(如 Propel 文档中的表格)连接,只有两个字段:order_id 和 item_id。

现在我必须实现一个功能来计算尚未发货的产品的订购数量,这样我们就可以跟踪我们的库存中有多少仍可供销售以及实际已经售出多少,但尚未发货。

为此,我必须选择与给定源产品相关且仅属于未发货订单的所有项目,然后对这些项目的数量字段求和。在 Propel2 中看起来像下面这样:

$ordered_qty = ItemQuery::create()
// Sum up the quantity of all ordered items and only select this one column
->withColumn('SUM(Item.Qty)', 'ordered_qty')
->select('ordered_qty')
// join with the cross referencing table between orders and order items
// so we can join with the actual order data in the next step
->leftJoinOrderItemCrossRef()
// join with the order data so that we can filter out
// already shipped (= archived) orders
->leftJoin('OrderItemCrossRef.Order')
->addJoinCondition('Order', 'Order.IsArchived != 1')
// only find the items relating to the desired product
->where('Item.ProductId = ?', $product_id)
->groupByProductId()
->findOne();

这个查询就像一个魅力,findOne() 返回尚未发货的订购数量。但是单独查询对我用处不大,我需要将结果添加到产品模型中。

我考虑过向 ProductQuery 添加一个自定义方法,为每个产品添加一个虚拟列“OrderedQty”,这样我就可以像这样选择所有产品:

$products = ProductQuery::create()
->withOrderedQty()
->find();

foreach($products as $product)
{
echo 'Ordered Qty of ' . $product->getName() . ': ' . $product->getOrderedQty() . '\n';
}

但我不知道如何使用子查询作为 Propel 中虚拟列的值。

最佳答案

如果我理解你的问题是正确的,你可以用 addSelectQuery 方法达到预期的效果。我没有所需的表结构,所以我只是给出它如何工作的提示。

addSelectQueryfrom 子句中添加一个 Criteria 作为子查询。

// some query from item table
$itemQuery = \ItemQuery::create()->...;

$productQuery = \ProductQuery::create()
->addSelectQuery($itemQuery, 'item_query_result_alias', false);

在这之后你会得到一个像这样的查询 carcase:

SELECT item.*
FROM item, (/* here will be the $itemQuery select */) AS item_query_result_alias

然后只需使用 withColumn 方法添加一个虚拟列:

$products = \ProductQuery::create()
->withColumn('item_query_result_alias.ordered_qty', 'ordered_qty')
->addSelectQuery($itemQuery, 'item_query_result_alias', false)
->find();

查询将是:

SELECT item.*, item_query_result_alias.ordered_qty AS ordered_qty
FROM item, (/* here will be the $itemQuery select */) AS item_query_result_alias

获取结果:

var_dump($products->getFirst()->getVirtualColumn('ordered_qty'));

关于php - 推进 2 : Using a subquery as the value for a virtual column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27487017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com