哪种方法更好更快 - Symfony2,Doctrine2

时间:2013-08-20 11:06:30

标签: symfony doctrine-orm

我有一些相关的实体,让我们说方便ProductCategory。它们与OneToMany和ManyToOne相关。 (每个产品有一个类别,一个类别有很多产品)

我的目标是在模板中显示所有类别及其所有产品,但按字母顺序排列。例如:

家具

  • 沙发
  • TV

  • 香蕉
  • 柠檬

办公室

  • 纸张

我希望对类别和产品进行排序。

所以:

方法1

使用doctrine编写查询以获取所有类别orderAy名称ASC,并获取所有产品orderedAy名称ASC然后在模板中:

{% for c in all_categories %}

    {{ c.name }}

    {% for p in all_products %}
        {% if p.category == c %}
            {{ p.name }}
        {% endif %}
    {% endfor %}

{% endfor %}

方法2

无论订购方式如何,只获取类别。将获取更改为渴望。然后将排序过滤器写为Twig Extension,如下所示:

public function sortByName($a, $b)
{
        if($a->getName() === $b->getName()) {
            return 0;
        }
        if($a->getName() < $b->getName()) {
            return -1;
        }
        return 1;       
}

并使用迭代器和uasort()使用此函数,然后在模板中使用:

{% for c in all_categories|sortbyname %}

    {{ c.name }}
    {% for p in c.products|sortbyname %}
        {{ p.name }}
    {% endfor %}

{% endfor %}

我可以看到,在 1 中,如果检查错误,因为许多检查将是多余的。当我已经拥有所有类别时获取所有产品也是多余的。但我认为使用Doctrine排序应该比使用twig扩展更快。所以我不知道应该使用哪一个。如果重要的是,在我的情况下,我有3个实体,如下所示:每个商店都有类别,每个类别都有产品。

你能帮帮我吗?首先十分感谢! :)

1 个答案:

答案 0 :(得分:0)

这是一个算法选择而不是symfony / doctrine问题。

我的方法是让所有产品按(category-name,product-name)排序,然后循环遍历它们以将它们存储在由您的类别索引的数组中。如果您有许多产品,并且有足够的内存可以将所有对象加载到一个,但速度更快(#nbproducts,而不是#nbproducts * #nbcategories),并且只使用一个ORM请求,它将使用索引来使用它排序数据。

Php代码看起来像这样:

$sorted_products = array();
foreach ($products as $product) {
  $category = $product->getCategory();
  if (!array_key_exists($category->getId(), $sorted_products)) {
      $sorted_products[$category->getId()] = array('category' => $category, 'products' => array());
  }
  $sorted_products['products'][] = $product;
}

然后你只需要在你的树枝上做两个foreach:

{% for category_infos in sorted_products %}
  {{ category_infos.category.name }}
  {% for product in category_infos.products %}
    {{ product.name }}
  {% endfor %}
{% endfor %}