我已经创建了自我引用 category entity, product extity 与类别实体的关系的关系。
示例类别列表:
MacBooks
-MacBook Air
--MacBook Air 11
--MacBook Air 13
-MacBook Pro
--MacBook Pro 13
我正在根据选定类别获得产品。
public function getByCategory($category)
{
$qb = $this->createQueryBuilder('p');
$qb->leftJoin('p.categories', 'c');
$qb->where('c.url = :category');
$qb->setParameter('category', $category);
return $qb->getQuery()->useQueryCache(true);
}
例如,产品在类别内 MacBook Air 13 。
因此,仅当我选择类别 MacBook Air 13 。
时,我的代码才有效。但是如何在父级中显示产品?例如,类别 MacBook Air 我想从类别显示MacBook Air 11 和 MacBook Air 13等。
...类别中的相同
问题简化:如何从所有孩子那里获取所有产品。
MacBook-> MacBook Air-> MacBook Air 11,MacBook Air 13
您可以尝试一件事。先获取所有给定类别的孩子和父母,然后在查询构建器中使用where...in
。我们可以用递归电话来做。
yourcontroller.php:
public function someAction(int $id)
{
// ...
$category = $em->getRepository('YourBundle:Category')->find($id);
$categories = $this->getAllCategories($category);
// OR
// $categories = $this->getAllChildren($category);
$products = $em->getRepository('YourBundle:Product')->getByCategories($categories);
// ...
}
private function getAllCategories(Category $category)
{
return array_merge(
$this->getAllChildren($category),
$this->getAllParents($category)
);
}
private function getAllChildren(Category $category)
{
static $categories = array();
$categories[] = $category->getId();
if(!$category->getChildren()->isEmpty())
{
foreach($category->getChildren() as $child)
{
$this->getAllChildren($child);
}
}
return $categories;
}
private function getAllParents(Category $category)
{
static $categories = array();
if($category->getParent())
{
$categories[] = $category->getParent()->getId();
$this->getAllParents($category->getParent());
}
return $categories;
}
productrepository.php:
// ...
public function getByCategories(array $categories)
{
$qb = $this ->createQueryBuilder('p')
->leftJoin('p.categories', 'c');
$qb->where($qb->expr()->in('c.id', $categories));
return $qb->getQuery()->getResult();
}
// ...
因此,我们可以从类别及其所有子女和父母及其所有孩子及其所有孩子中获取所有产品。
希望它有帮助。