Symfony / Doctrine - 按儿童和家长类别显示数据库中的产品

问题描述 投票:0回答:1

我创建了自引用类别实体、产品实体,与类别实体具有多对多关系。

类别列表示例:

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

php symfony doctrine-orm
1个回答
2
投票

你可以尝试一件事。首先获取给定类别的所有子项和父项,然后在查询生成器中使用

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();
}

// ...

因此,我们可以从类别及其所有子级和父级中获取所有产品,或者仅从类别及其所有子级中获取。

希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.