我有一些相关的实体,让我们说方便Product
和Category
。它们与OneToMany和ManyToOne相关。 (每个产品有一个类别,一个类别有很多产品)
我的目标是在模板中显示所有类别及其所有产品,但按字母顺序排列。例如:
家具
餐
办公室
我希望对类别和产品进行排序。
所以:
方法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个实体,如下所示:每个商店都有类别,每个类别都有产品。
你能帮帮我吗?首先十分感谢! :)答案 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 %}