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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在没有实体的学说查询中合并连接表相关的知识,希望对你有一定的参考价值。

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

这是我的设置。我有一个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 DoctrineCommonCollectionsCollection
 *
 * @ORMManyToMany(targetEntity="AppBundleEntityCategory", inversedBy="stage", cascade={"remove", "persist"})
 * @ORMJoinTable(name="stage_category")
 * @ORMJoinColumn(onDelete="SET NULL")
 */
private $category;

反之亦然:

/**
 * @var DoctrineCommonCollectionsCollection
 *
 * @ORMManyToMany(targetEntity="Stage", mappedBy="category", cascade={"remove", "persist"})
 */
private $stage;

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

答案

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

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

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

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

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

学说(连接)类表继承中根实体的查询字段

学说2:在多对多关系中引用连接表

学说 2 和 ORM:如何缓存某个实体的每个查询?

与连接表的一个实体的适当实体关联映射(学说 2)

Symfony 2 实体连接或学说查询连接

具有该实体外键的学说实体