Symfony / Doctrine - 按类别显示儿童和父母的数据库产品

时间:2017-11-24 06:35:15

标签: symfony doctrine-orm

我已经多对多创建了自引用 类别实体,产品实体>与类别实体的关系。

示例类别列表:

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

1 个答案:

答案 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;
}

因此,我们可以从类别及其所有孩子和父母那里获得所有产品,或者只从类别及其所有孩子那里获得。

希望它有所帮助。