我创建了自引用类别实体、产品实体,与类别实体具有多对多关系。
类别列表示例:
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 等类别的产品...
类别相同 MacBooks 显示 MacBook Air、MacBook Air 11、MacBook Air 13 等的所有内容...?
问题简化: 如何从所有孩子那里获得所有产品。
MacBook -> MacBook Air -> MacBook Air 11、MacBook Air 13
你可以尝试一件事。首先获取给定类别的所有子项和父项,然后在查询生成器中使用
where...in
。我们可以通过递归调用来完成。
你的控制器.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;
}
产品存储库.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();
}
// ...
因此,我们可以从类别及其所有子级和父级中获取所有产品,或者仅从类别及其所有子级中获取。
希望有帮助。