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

Posted

技术标签:

【中文标题】如何在没有实体的原则查询中合并连接表【英文标题】:How to incorporate a join table in a doctrine query that has no entity 【发布时间】:2016-06-14 04:13:36 【问题描述】:

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

这是我的设置。我有一个 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;

有什么可行的方法可以获取我需要的数据吗?

【问题讨论】:

【参考方案1】:

Stage 和 Category 之间没有实体的原因是因为在该关系中没有其他任何东西可以证明实体的存在(这就是它是 manyToMany 的原因)。

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

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

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

【讨论】:

以上是关于如何在没有实体的原则查询中合并连接表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MCV 中合并两个实体框架查询

如何在 Symfony 2 中为数据库视图设置实体(原则)

如何配置 Hibernate Envers 以避免实体修订查询中的某些集合(连接表)

Spring Data JPA 多个实体类表联合视图查询

如何在没有主键的情况下从连接表中创建实体

如何在doctrine zend中没有实体的情况下继续加入查询构建器