関連するエンティティがいくつかあります。便宜上Product
、Category
. これらは OneToMany と ManyToOne に関連しています。(各製品には 1 つのカテゴリがあり、1 つのカテゴリには多くの製品があります)
私の目標は、すべての製品を含むすべてのカテゴリをテンプレートに表示することですが、アルファベット順に表示することです。たとえば、次のようにします。
家具
- ベッド
- ソファー
- テレビ
食事
- バナナ
- 魚
- レモン
オフィス
- 紙
- ペン
カテゴリと商品の両方を並べ替えたい。
そう:
アプローチ1
教義を使用して、すべてのカテゴリを名前 ASC で順序付けし、すべての製品を名前 ASC で順序付けして取得し、テンプレート内で取得するクエリを記述します。
{% for c in all_categories %}
{{ c.name }}
{% for p in all_products %}
{% if p.category == c %}
{{ p.name }}
{% endif %}
{% endfor %}
{% endfor %}
アプローチ 2
順序に関係なく、カテゴリのみを取得します。フェッチを熱心に変更します。次に、並べ替えフィルターを Twig 拡張として次のように記述します。
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 つのエンティティがあります。各ショップにはカテゴリがあり、各カテゴリには製品があります。
手伝ってくれませんか?よろしくお願いします!:)