スキーマ:
カテゴリ [、、、、、、、、]
id
_parent
_children
_left
_right
_level
root
products
製品 [
id
、、category
]marketSegments
MarketSegment [
id
]また、各エンティティには、、など
name
のフィールドがありますがdescription
、slug
これらは私の問題には関係ありません。
サンプルデータ
伝説:
c
-カテゴリ、p
-製品
*でマークされた製品は、市場セグメント「ExporttoUSA」でタグ付けされています
Food [c, id: 1, level: 0]
---> Vegetables [c, id: 2, level: 1]
--------------> Potato [p, id: 1]
--------------> Carrot [p, id: 2]
---> Fruits [c, id: 3, level: 1]
--------------> Berries [c, id: 5, level: 2]
---------------------------> Grapes [p, id: 3]
--------------> Hesperidiums [c, id: 6, level: 2]
---------------------------> Orange* [p, id: 4]
---> Meat [c, id: 4, level: 1]
--------------> Beef* [p, id: 5]
期待されるクエリ結果:
与えられたデータと$category = Food、$ marketSegment = Export to USAの場合、期待される結果は次のようになります。
$filteredCategories = [Fruits, Meat]
なんで?
Meat
Beef
これは、ExporttoUSAでタグ付けされた製品が含まれているためです。Fruits
タグ付けされた製品を含むカテゴリHesperidiums
が含まれているためです。
ネストされたツリーの深さは、タグ付けされた製品を含むカテゴリに関係ありません。
これ:
Sports [c]
-----> Individual [c]
----------------> Fight [c]
----------------------> MMA [c]
--------------------------> Boxing gloves* [p]
$ category = Sportsの場合:[ Individual
]を返す必要があります。
$ category = Fightの場合は次を返す必要があります:[ MMA
]。
私の(機能していない)DQLアプローチ:
SELECT DISTINCT cat FROM Avocode\CatalogBundle\Entity\Category cat
WHERE cat.parent = :parent_id
AND (EXISTS(
SELECT sub FROM Avocode\CatalogBundle\Entity\Category sub
LEFT JOIN sub.products prod
LEFT JOIN prod.marketSegments seg
WHERE sub.left > cat.left
AND sub.right < cat.right
AND seg.id = :segment_id
))
ORDER BY cat.root, cat.left ASC