0

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

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

家具

  • 沙发
  • 电视

膳食

  • 香蕉
  • 柠檬

办公室

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

所以:

方法一

使用教义编写查询以获取所有按名称 ASC 排序的类别,并按名称 ASC 获取所有产品,然后在模板中:

{% for c in all_categories %}

    {{ c.name }}

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

{% endfor %}

方法二

仅获取类别,无论它们如何排序。将获取更改为渴望。然后将排序过滤器编写为 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中,if 检查很糟糕,因为许多检查都是多余的。当我已经拥有所有类别时获得所有产品也是多余的。但我认为使用 Doctrine 进行排序应该比使用 twig 扩展更快。所以我不知道我应该使用哪一个。如果重要的话,就我而言,我有 3 个实体,如下所示:每个商店都有类别,每个类别都有产品。

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

4

1 回答 1

0

这更像是一个算法选择,而不是一个 symfony/教义问题。

我的方法是让所有产品按(类别名称,产品名称)排序,然后循环它们以将它们存储在由您的类别索引的数组中。如果您有许多产品,并且有足够的内存来一次加载所有对象,则可以使用它,但速度会更快(#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;
}

然后你只需要在你的树枝上做 2 次 foreach :

{% for category_infos in sorted_products %}
  {{ category_infos.category.name }}
  {% for product in category_infos.products %}
    {{ product.name }}
  {% endfor %}
{% endfor %}
于 2013-08-20T17:45:18.833 回答