簡體   English   中英

PHP最佳實踐,用於使用匯總數據查詢一組類對象

[英]PHP Best Practices for querying a group of class objects with summarized data

這是一個相當廣泛的問題,但我希望我可以得到一些指導。

我正在為我的公司建立報告系統。 我有用於客戶,訂單,發票和物料的類。 它們非常適合單個對象。 但是,這是一個報告系統,我將需要以多種方式查詢和總結這些對象。

例如,單個Order對象將具有該訂單的總美元價值。 但是,如果要生成該月的報告,則我想總結一組與我通過查詢的參數(例如日期范圍和/或客戶編號)匹配的訂單。

這通常涉及額外的工作,例如為月度至今或年度迄今比較累計運行總計。 這對我來說有點模糊。 該邏輯是否屬於Order類? 如果沒有,那么在哪里? 注意我的發票類也必須做同樣的事情。

這是我現在使用Order類所做的簡化版本。 我使用一個函數(getOrders)返回一個Order對象數組,另一個函數(getOrderGroup)返回一個分組結果數組(不是對象)。

我最不清楚的是getOrdersGroup()函數。 如果有更好的做法來報告分組結果以及計數,總計和累計結果,請指出更好的方法!

<?php
class Order {
    public $number;
    public $customer;
    public $date_ordered;
    public $date_shipped;
    public $salesperson;
    public $total;

    public function __construct(array $data = array()) {
        $this->number = $data['number'];
        $this->customer = $data['customer'];
        $this->date_ordered = $data['date_ordered'];
        $this->date_shipped = $data['date_shipped'];
        $this->salesperson = $data['salesperson'];
        $this->total = $data['total'];      
    }

    /**
     * Returns an array of order objects
     */         
    public static function getOrders(array $options = array()) {
        $orders = array();

        // Build query to return one or more orders
        // $options parameter used to form SQL query
        // ......

        $result = mysql_query($query);
        while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
            $order = new Order($row);
            $orders[] = $order;
        }
        return $orders;
    }

    /**
     * Returns an array of grouped order results (not objects)
     */         
    public static function getOrdersGroup(array $options = array()) {
        $group = array();

        // Build query that contains COUNT() and SUM() group by functions
        // ......

        $running_total = 0;
        $result = mysql_query($query);
        while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {

            // Accumulate running total for the month
            $running_total += $row['sum_total'];

            // Build the group array with a listing of summarized data
            // Note: The order class is never actually instantiated here
            // Also, in this example we're grouping by date_ordered...
            // but in reality the result should be able to be grouped by a
            // dynamic field, such as by customer, or by salesperson,
            // or a more detailed breakdown with year, month, day and a running
            // total break at each level
            $group[] = array(
                "date_ordered" => $row["date_ordered"],
                "count_customers" => $row["count_customers"],
                "count_orders" => $row["count_orders"],
                "count_salespersons" => $row["count_salesperson"],
                "sum_total" => $row["sum_total"],
                "running_total" => $running_total);
        }
        return $group;
    }

    /**
     * Queries to get ordered items if drilling down to item level...
     */             
    public function getItems() {
        // blah
    }
}
?>

有許多任務需要完成,是的,其中有些任務是特定於每個班級的。 尤其是當要知道存在哪些列以及如何處理它們時。 但另一方面,存在“將某物分組”和構建搜索模式的抽象邏輯(當然,這還包括一系列日期處理功能)。 可以/應該將這兩個放置在單獨的對象/函數中,可以從類, ordersinvoices調用它們。

將結果數組放在一起也有類似的事情。 在這里,我們需要能夠適應各種不同的分組條件。 列名稱是特定於類的,但是常規邏輯可以放在單獨的類或函數中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM