スキーマ:
カテゴリ [、、、、、、、、]
id_parent_children_left_right_levelrootproducts製品 [
id、、category]marketSegmentsMarketSegment [
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