如何在没有实体的学说查询中合并连接表

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

不确定这里的标题是否有点含糊不清,但基本上我要做的是从数据库中获取数据,但我需要引用一个没有自己的实体的连接表,因为它只在另一个实体中引用。

这是我的设置。我有一个Symfony2项目,我有一个数据库中的阶段列表,每个阶段可以是一个或多个类别。我需要从特定类别中获取所有阶段,并按相关排序顺序对其进行排序。如果我直接在mySQL中这样做,我会写:

SELECT s.stage FROM stage s LEFT JOIN stage_category sc ON sc.stage_id = s.id WHERE sc.category_id = 1 ORDER BY s.sort_order

但问题是,“stage_category”连接表没有实体,所以如果我在我的Doctrine查询中引用它,它告诉我它不存在。我写的是:

$qb = $this->createQueryBuilder('s')
            ->select('s')
            ->join('stage_category','sc')
            ->where('sc.category_id = :cat')
            ->setParameter('cat', $cat);

虽然,不完全确定这是否正确 - 它位于我的存储库类中,名为findStagesInCategory()。

/**
 * @var \Doctrine\Common\Collections\Collection
 *
 * @ORM\ManyToMany(targetEntity="AppBundle\Entity\Category", inversedBy="stage", cascade={"remove", "persist"})
 * @ORM\JoinTable(name="stage_category")
 * @ORM\JoinColumn(onDelete="SET NULL")
 */
private $category;

反之亦然:

/**
 * @var \Doctrine\Common\Collections\Collection
 *
 * @ORM\ManyToMany(targetEntity="Stage", mappedBy="category", cascade={"remove", "persist"})
 */
private $stage;

是否有任何合理的方式来获取我需要的数据?

php mysql symfony doctrine-orm
1个回答
6
投票

阶段和类别之间没有实体的原因是因为在该关系中没有任何其他东西可以证明实体的存在(这就是为什么它是一个很多的东西)。

你想要做的是获取连接并过滤关系:

$qb = $this->createQueryBuilder('s')
        ->select('s')
        ->join('s.category','c')
        ->where('c.category_id = :cat')
        ->setParameter('cat', $cat);

或者,如果stage_category具有证明实体存在的属性,则可以将映射更改为一对多和多对一,这将允许您使用查询构建器执行原始查询。

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