我已经多对多创建了自引用 类别实体,产品实体>与类别实体的关系。
示例类别列表:
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
答案 0 :(得分:1)
你可以尝试一件事。首先获取给定类别的所有子级和父级,然后在查询构建器中使用{ messages = {
message = (
{
code = E00003;
text = "The element 'createTransactionRequest' in namespace
'AnetApi/xml/v1/schema/AnetApiSchema.xsd' has invalid child element
'refId' in namespace 'AnetApi/xml/v1/schema/AnetApiSchema.xsd'. List of
possible elements expected: 'merchantAuthentication' in namespace
'AnetApi/xml/v1/schema/AnetApiSchema.xsd'.";
}
);
resultCode = Error;
};
}
。我们可以通过递归调用来实现。
YourController.php:
where...in
ProductRepository.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;
}
因此,我们可以从类别及其所有孩子和父母那里获得所有产品,或者只从类别及其所有孩子那里获得。
希望它有所帮助。