我正在尝试使用 Doctrine 构建查询,但我不确定是否可以完成。
我需要的是获得一个结果,显示所请求项目的ID及其数量的总和已经实现。
我有四张桌子:
我可以创建请求并为此请求分配一个或多个项目,这些项目存储在 RequestItems ,然后我需要创建订单对于此请求,订单必须旨在满足请求的项目,但它可能是单个订单或多个订单,因此每个订单包含一个或多个存储在 OrderItems 的项目。
以下是表格的示例:
Request
| ID | Date |
|----|------------|
| 1 | 2014-05-12 |
| 2 | 2014-05-13 |
RequestItems
| ID | RequestID | Name |Qtty |
|----|-----------|---------------------|-----|
| 1 | 1 | 60W Light Bulb | 5 |
| 2 | 1 | Bticino switch | 3 |
| 3 | 2 | 60W Light Bulb | 10 |
| 4 | 2 | 80W Light Bulb Warm | 15 |
Order
| ID | RequestId | Date | State |
|----|-----------|------------|-------|
| 1 | 1 | 2014-05-14 | 1 |
| 2 | 1 | 2014-05-15 | 1 |
| 3 | 2 | 2014-05-15 | 1 |
| 4 | 2 | 2014-05-16 | 1 |
| 5 | 2 | 2014-05-17 | 1 |
OrderItems
| ID | RequestItemsID | OrderID | Qtty |
|----|----------------|---------|------|
| 1 | 1 | 1 | 5 |
| 2 | 2 | 2 | 3 |
| 3 | 3 | 3 | 2 |
| 4 | 3 | 4 | 2 |
| 5 | 3 | 5 | 1 |
| 6 | 4 | 5 | 10 |
这里有两个请求: 第1名:要求两件物品(5个60W灯泡,3个Bticino开关) 2号:要求一件物品(10个60W灯泡,15个80W暖灯泡)
对于这些请求,我创建了5个订单,其中两个用于满足第一个请求,另外三个用于满足第二个请求。
前两个订单已解决了第一个请求并提供了请求的项目,因此应首先完成请求。
最后三个订单正在处理第二个请求,并已提供10个60W灯泡中的5个和80个80W暖灯泡。
我需要的是获取OrderItems的ID和数量以及OrderItems上的Qtty的SUM,这些ID由RequestItem ID分组并按订单状态和请求ID过滤
作为一个样本,我需要获取请求数量的RequestedItems,并且已经为订单状态为1的请求编号2订购了
| RequestItemsID | QttyRequested | QttyOrdered (SUM) |
|----------------|---------------|-------------------|
| 3 | 10 | 5 |
| 4 | 15 | 10 |
此结果按其ID对请求的项目进行分组并返回请求数量,同时对此 RequestItem
的已经订购的 OrderItems 的amm进行SUM鉴于此结果,我也可以计算待定项目。
我设法解决了这个问题,构建两个查询一个获取RequestedItems,一个获取OrderedItems并将这两个与PHP匹配,但我认为可以在数据库端执行此操作。
如果有人能帮助我,我将不胜感激。
感谢。
更新#1:
使用QueryBuilder时,我在连接中遇到子查询问题,但我设法构建一个工作查询,在连接条件中添加子查询。
我正在下面添加我的工作查询,但我仍然需要进行多项检查,看看它是否真的是我的答案。
答案 0 :(得分:0)
您可以通过执行
获取示例结果SELECT ri.ID AS RequestItemsID, ri.Qtty AS QttyRequested,
SUM(oi.qtty) AS QttyOrdered
FROM RequestItems ri
INNER JOIN Order AS o ON o.RequestId = ri.RequestId
INNER JOIN OrderItems AS oi ON oi.OrderId = o.ID
WHERE ri.RequestId = 2 AND o.State = 1
GROUP BY ri.RequestId, o.State
答案 1 :(得分:0)
似乎Doctrine不支持查询的JOIN部分中的子查询,但我设法在JOIN的条件部分添加子查询。
基于https://groups.google.com/forum/#!topic/doctrine-user/0rNbXlD0E_8,这可以通过IN解决( SUBQUERY )
这是现在正在运行的OP中的示例
SELECT ri.ID AS RequestItemsID, ri.Qtty AS QttyRequested, COALESCE(SUM(oi.Qtty), 0) AS QttyOrdered
FROM RequestItems AS ri
LEFT JOIN OrderItems AS oi ON oi.RequestItemsID = ri.ID AND oi.OrderID IN (
SELECT o.ID FROM Order AS o WHERE o.State = 1 AND o.RequestID = 2
)
WHERE ri.RequestID = 2
GROUP BY ri.ID;