В моем проекте у меня есть несколько сущностей, которые принимают древовидную структуру.
На некоторых объектах я реализовал поведение вложенного набора доктрин, и у меня есть четкая структура родитель-потомок.
В отношении других я определил себя как самоассоциацию, поскольку у меня есть дополнительные поля в таблице «многие ко многим».
Например:
Entity Recipe содержит $ subrecipes
SubRecipe — это новая сущность с параметром под названием вес. 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();
}
Как я могу предотвратить это и получить дерево ошибок в одном запросе?
Я знаю, что могу сделать самостоятельное присоединение к подрецептам, но как повторить это столько раз, сколько необходимо для получения полного дерева?
$result = $this
->createQueryBuilder('r')
->leftJoin('r.subrecipes', 's')
->leftJoin('s.subrecipe', 's1')
->leftJoin('s1.subrecipes', 's2')
->leftJoin('s2.subrecipe', 's3')
->...
;
Задача ещё не решена.
Других решений пока нет …