在我的项目中,我有几个采用树状结构的实体。 在某些实体上,我实现了教义嵌套集行为,并且我有一个明确的父子结构。 在其他人身上,我将自己定义为自我关联,因为我在多对多的表格中有额外的字段。 例如:
实体食谱有$ subrecipes SubRecipe是一个新实体,其参数称为weight。 SubRecipe $ parentRecipe是父配方。 SubRecipe $ subRecipe是子食谱:
/**
* @ORM\OneToOne(targetEntity="\AppBundle\Entity\FoodAnalytics\Recipe", inversedBy="parentRecipe")
* @ORM\JoinColumn(name="subrecipeId", referencedColumnName="id", nullable=false)
*/
private $subRecipe;
/**
* @ORM\ManyToOne(targetEntity="\AppBundle\Entity\FoodAnalytics\Recipe", inversedBy="subrecipes")
* @ORM\JoinColumn(name="parentRecipeId", referencedColumnName="id", nullable=false, onDelete="cascade")
*/
private $parentRecipe;
为了获得食谱重量,我通过食谱循环,但每次都查询数据库。
到目前为止,我有:
foreach($this->getSubrecipes() as $subrecipe)
{
/**
* @var $subrecipe RecipeSubrecipe
*/
$weight += $subrecipe->getSubRecipe()->getWeight();
}
如何在一个查询中阻止并检索wole树? 我知道我可以在subrecipes上自我加入但是如何根据需要多次重复这个以获得完整的树?
$result = $this
->createQueryBuilder('r')
->leftJoin('r.subrecipes', 's')
->leftJoin('s.subrecipe', 's1')
->leftJoin('s1.subrecipes', 's2')
->leftJoin('s2.subrecipe', 's3')
->...
;