0

我正在尝试基于根分类单元“类别”中的分类单元构建动态菜单。这是我想要的菜单:

  • A类群
    • 分类单元 A1
    • 分类单元 A2
  • 分类群 B
    • 分类群 B1
      • 分类单元 B1a
      • 分类单元 B1b

我编写了一些以这种方式工作的东西:

首先,我覆盖了分类单元存储库

use Sylius\Bundle\...\TaxonRepository as BaseRepository;

class TaxonRepository extends BaseRepository
{
    /**
     * @return \Doctrine\Common\Collections\ArrayCollection
     */
    public function findForMenu()
    {
        return $this
            ->createQueryBuilder('t')
            ->innerJoin('t.taxonomy', 'ta')
            ->innerJoin('ta.root', 'r')
            ->where('ta.name = :name')
            ->andWhere('t.parent = r')
            ->setParameter('name', 'Category')
            ->getQuery()
            ->getResult();
    }
}

然后,我创建了一个菜单生成器

class MenuBuilder
{
    private $factory;
    private $repository;

    public function __construct($factory, TaxonRepository $repository)
    {
        $this->factory = $factory;
        $this->repository = $repository;
    }

    public function createMain(Request $request)
    {
        $menu = $this->factory->createItem('root');

        foreach ($this->repository->findForMenu() as $taxon) {
            $menu->addChild($this->buildChild($taxon));
        }

        return $menu;
    }

    private function buildChild(Taxon $taxon)
    {
        $item = $this->factory->createItem($taxon->getName());

        foreach ($taxon->getChildren() as $child) {
            $item->addChild($this->buildChild($child));
        }

        return $item;
    }
}

它运行良好,但由于延迟加载有很多查询,所以我决定使用 ClosureTreeRepository(Gedmo)的行为。我意识到我不能这样做,因为你必须从 Sylius 的存储库继承,而你不能从 Gedmo 的 ClosureTreeRepository 继承。

关于如何通过 ORM 构建好分类单元树的任何提示?

4

1 回答 1

0

由于延迟加载,您会收到很多查询。为防止发生这种情况,您应该通过添加->select()并选择构建菜单所需的所有内容来更新您的查询。

像这样的东西:

class TaxonRepository extends BaseRepository
{
    public function findForMenu()
    {
        return $this
            ->createQueryBuilder('t')
            ->select('t', 'ta', 'r')
            ->innerJoin('t.taxonomy', 'ta')
            ->innerJoin('ta.root', 'r')
            ->where('ta.name = :name')
            ->andWhere('t.parent = r')
            ->setParameter('name', 'Category')
            ->getQuery()
            ->getResult();
    }
}
于 2015-01-22T07:42:21.687 回答