2015-03-02 36 views
2

我有一個名爲tableOrders,和另一個叫orderProducts凝結多行成一個單一的,許多情況下

orderProducts包含CustomerID字段,listCustomerOrders()然後在DB中查找匹配的行。返回的輸出如下:

array() { 
    [0]=> 
    object(Basket)#3 (11) { 
    ["ProductName"]=> 
    string(17) "Green Pesto Bagel" 
    ["completeDate"]=> 
    string(19) "2015-02-25 11:00:00" 
    } 
    [1]=> 
    object(Basket)#4 (11) { 
    ["ProductName"]=> 
    string(12) "Cheese Bagel" 
    ["completeDate"]=> 
    string(19) "2015-02-25 11:00:00" 
    } 
    [2]=> 
    object(Basket)#4 (11) { 
    ["ProductName"]=> 
    string(12) "Salt Beef Bagel" 
    ["completeDate"]=> 
    string(19) "2015-02-25 11:00:00" 
    } 
    [3]=> 
    object(Basket)#4 (11) { 
    ["ProductName"]=> 
    string(12) "Veggie Bagel" 
    ["completeDate"]=> 
    string(19) "2015-02-25 11:00:00" 
    } 
    [4]=> 
    object(Basket)#4 (11) { 
    ["ProductName"]=> 
    string(12) "Chicken Bagel" 
    ["completeDate"]=> 
    string(19) "2015-03-25 20:30:00" 
    } 
    [5]=> 
    object(Basket)#4 (11) { 
    ["ProductName"]=> 
    string(12) "Cheese Salad" 
    ["completeDate"]=> 
    string(19) "2015-03-25 20:30:00" 
    } 
} 

並顯示爲;

------1st order, date:02-25-15 11:00------- 
Green Pesto Bagel 
Cheese Bagel 
Salt Beef Bagel 
Veggie Bagel 
------2nd order, date:03-25-15 11:00------- 
Chicken Bagel 
Cheese Salad 

我想知道如何處理每orderDate輸出一個結果,而遍歷每個row任何附加產品,並將它們添加到陣列。

我可以使用某種計數器通過每個代碼塊迭代,當條件滿足到下一個進步?

這裏有功能,歡呼!

function myAccount(){ 

    require_once('classes/basket.php'); 

    // pull the customers order 
    $CustomerID = $_SESSION['CustomerID']; 
    $Limit = 20; 

    $results = Basket::listCustomersOrders($CustomerID, $Limit); 
    $orders['orders'] = $results['results']; 

    include('templates/myAccount.php'); 
} 

public static function listCustomersOrders($CustomerID, $Limit){ 


    $conn = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD); 
    $sql = "SELECT Orders.OrderID, Orders.payPalRef, Orders.SubTotal, Orders.completeDate, 
      OrderProducts.Quantity, OrderProducts.ProductName, OrderStatus.Status 
      FROM Orders 
      LEFT OUTER JOIN OrderProducts 
      ON Orders.OrderID = OrderProducts.OrderID 
      LEFT OUTER JOIN OrderStatus 
      ON Orders.OrderStatusID = OrderStatus.OrderStatusID 
      WHERE CustomerID = :CustomerID AND (Status = 'Cash on Delivery' or Status = 'PayPal') ORDER BY CompleteDate DESC LIMIT :Limit"; 

    $st = $conn->prepare($sql); 
    $st->bindValue(":CustomerID", $CustomerID, PDO::PARAM_INT); 
    $st->bindValue(":Limit", $Limit, PDO::PARAM_INT); 
    $st->execute(); 

    $list = array(); 

    while ($row = $st->fetch()) { 
     $basket = new Basket($row); 
     $list[] = $basket; 
    } 

    //var_dump($list); 


    $conn = null; 
    return (array ("results" => $list)); 

} 
+1

只能看到這個表面上看起來像'group by'的工作 – developerwjk 2015-03-02 19:03:18

+1

請更完整地解釋所需的輸出。 4-5個訂單和3個相同日期的例子會有所幫助。 – 2015-03-02 20:04:13

+0

根據要求@PeterBowers更新了我的問題。 developerwjk,我看了一下gro,似乎看不出它會如何幫助。你介意解釋嗎?謝謝 – atoms 2015-03-02 21:33:18

回答

1
$lastdate = null; 
$ordercnt = 1; 
foreach ($orders[´orders´] as $row) { 
    if ($lastdate != $row[´completeDate´]) { 
     echo '--Order #'.$ordercnt++.' Date '.$row[´completeDate´].'--<br />'; 
     $lastdate = $row[´completeDate´] 
    } 
    echo $row[´ProductName´].'<br />'; 
} 
+0

如果答案是這樣,請將其標記爲答案。如果沒有,請澄清這個問題。 – 2015-03-05 07:13:48

+0

嗨,彼得,稍作修改就做了這個工作。謝謝 – atoms 2015-03-06 09:09:21

0

由於彼得斯INOUT我創建了一個腳本,沒有工作。

// Init the counters and vars 
$lastdate = null; 
$ordercnt = 1; 
$output = ""; 

while ($row = $st->fetch()) { 
    // if CompleteDate exists proceed 
    if ($lastdate != $row['completeDate']) { 

     if($lastdate != null){ 
      $output .=" 
        <form action=\"reorder\" method=\"post\"> 
          <button value=\"".$row['OrderID']."\" name=\"OrderID\" class=\"green-button\" style=\"width: 110px;float: right;margin-top: -40px;\">Order</button> 
        </form> 
       </ul><hr>"; 
     } 

     $output .= '<ul class="previousOrderList"><li>Order #'.$ordercnt++.', Date: '.$row['completeDate'].'-- Total '.$row['SubTotal'].'</li>'; 
     $output .= '<li>'.$row['Status'].' -- Total: '.$row['SubTotal'].'</li>'; 

     $lastdate = $row['completeDate']; 

    } 
    $output .='<li>'.$row['ProductName']." x ".$row['Quantity'].'</li>'; 
} 
if ($output){$output .= "</ul>";}  // if there is results, add the end of line here 

$conn = null; 
return $output; 
}