【问题标题】:Need clarification about nested models需要澄清嵌套模型
【发布时间】:2010-09-01 14:03:08
【问题描述】:

我需要一个关于如何操作嵌套模型的示例。

假设我们有一些订单管理应用程序和模型:Order、Position、Item。

订单可以包含职位,职位可以包含项目。

问题是:如何处理数据选择?

一些需要的用例:

  • 获取带有仓位的订单列表和 项目(如我的示例代码)
  • 仅获取订单列表(不含职位和项目)
  • 获取一些统计信息,例如单个 Position 中所有 Item 的总数

我可以这样做:

class Order_Mapper
{
    public function getOrders($criteria)
    {
        $orders = array(); // Get order list from DB

        foreach($orders as $order)
        {
            $positions = Position_Mapper::getPositionsByOrderId($order->id);

            foreach($positions as $position)
            {
                $order->addPosition($position);
            }
        }

        return $orders;
    }
}

class Position_Mapper
{
    public function getPositionsByOrderId($order_id)
    {
        $positions = array(); // Get position list from DB

        foreach($positions as $position)
        {
            $items = Item_Mapper::getItemsByPositionId($position->id);

            foreach($items as $item)
            {
                $position->addItem($item);
            }
        }

        return $positions;
    }
}

...但这效率低下,因为需要许多 SQL 查询,一个用于订单选择,一个用于每个 Order 以获取 Positions,然后一个用于每个 Position 以获取 Items。

我在 MVC 方面非常缺乏经验,所以欢迎任何帮助!


关于 Doctrine - 我真的不想学习新的 ORM 套件,也不介意手动编写 SQL 查询。我只需要知道如何完成上述任务。

Here 是我第二次尝试在没有开销的情况下完成上述所有用例。请看一看,告诉我你的想法。代码很简单。

【问题讨论】:

    标签: php model-view-controller model nested hierarchy


    【解决方案1】:

    在这种情况下,我会使用像Doctrine 这样的高级对象关系映射器。然后,您可以避免 n+1 问题并使用带有 JOIN 的复杂查询来一次检索相关数据,而不是选择所有订单,然后在循环中为每个订单选择所有位置等。您无需自己编写映射代码它将数据库结构映射到对象。相反,您只需使用公开 getAllOrders 等方法的存储库。在那里指定您的查询并让 Doctrine 完成繁重的工作。

    当您需要一种更类似于行的方法来进行统计等报表样式查询时。Doctrine afaik 还支持本地查询,您可以直接访问数据库并使用自定义 SQL。

    关于该主题的更多信息:

    stackoverflow 上也有很多关于这些主题的问题。这些只是帮助您入门的一些提示。由于您似乎在这些主题上没有太多经验,因此请注意:有一个学习曲线,但它确实值得,因为您可以使用这些技术和模式驯服甚至复杂的场景。

    【讨论】:

      猜你喜欢
      • 2011-05-07
      • 2011-11-09
      • 2012-07-18
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 2010-10-18
      • 2023-02-16
      相关资源
      最近更新 更多