架构:
类别 [
id
,parent
,children
,left
,right
,level
,root
,products
]产品 [
id
,category
,marketSegments
]市场细分 [
id
]此外,每个实体都有 , 之类的字段 ,
name
但 这些与我的问题无关。description
slug
示例数据
传奇:
c
- 类别,p
- 产品
标有 * 的产品标有“出口到美国”的细分市场
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
标有出口到美国的产品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