用汇总数据查询一组类对象的PHP最佳实践

用汇总数据查询一组类对象的PHP最佳实践,php,mysql,oop,Php,Mysql,Oop,这是一个相当广泛的问题,但我希望我能得到一些指导 我正在为我的公司建立一个报告系统。我有客户类、订单类、发票类和商品类。它们对单个对象非常有效。但是,这是一个报告系统,我需要以各种方式查询和汇总这些对象 例如,单个订单对象将具有该订单的总美元值。但是,如果我要生成当月的报告,我想汇总一组与我通过查询的任何参数(例如日期范围和/或客户编号)相匹配的订单 这通常涉及额外的工作,例如累积月到日或年到日比较的运行总计。这就是事情变得有点模糊的地方。这个逻辑属于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
    }
}
?>

有许多任务需要完成,是的,其中一些任务是特定于每个类的。特别是在知道有哪些栏目以及如何处理这些栏目时。但另一方面,还有“分组”和构建搜索模式的抽象逻辑(当然,这还包括一系列日期处理函数)。这两个可以/应该放在单独的对象/函数中,这些对象/函数可以从两个类调用,
orders
invoices

将结果数组放在一起也有类似的情况。在这里,我们需要能够适应各种不同的分组条件。列名是特定于类的,但一般逻辑可以放在单独的类或函数中