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

Posted

技术标签:

【中文标题】学说(连接)类表继承中根实体的查询字段【英文标题】:Query field of root entity in doctrine (joined) class table inheritance 【发布时间】:2015-04-17 09:28:28 【问题描述】:

我有一个名为 Content 的实体。 这是我所有其他与内容相关的实体的抽象基类。

/**
* MyBundle\Entity\Content
*
* @ORM\Entity(repositoryClass="MyBundle\Repository\ContentRepository")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\Table(name="MyBundle_content")
* @ORM\HasLifecycleCallbacks
*/
abstract class Content

内容属性:

身份证 更新 ....

此外,我还有很多不同的实体都扩展了内容。

在我的存储库中(另一个不是内容且不扩展内容的实体)我有一个相当复杂的查询,我想在其中选择所有内容对象的“更新”字段(取决于其他一些无关的东西)

编辑: 但在该查询中,内容实体通过“->leftJoin('p.content','c')”连接到另一个实体。 我的意思是我在一个完全不同的实体的存储库中,它与内容有关系,这就是为什么我用 '->leftJoin('p.content', 'c' 将内容加入到那里)'(其中 p 是我当前所在的存储库的实体。

问题是,在该查询原则中,将每个将 Content 扩展到内容表的实体都连接起来。 因为我有很多实体,所以我得到的错误是

General error: 1116 Too many tables; mysql can only use 61 tables in a join

就我而言,我不需要所有这些连接表,因为我需要的信息仅在 Content 表中。

有没有办法只查询根实体表,同时仍然使用查询构建器而不编写自己的sql?

【问题讨论】:

【参考方案1】:

是的,有:

$result = $this->em->getRepository('MyBundle:Content')
             ->createQueryBuilder('c')
             ->select('c')
             ->leftJoin('c.Other', 'p')
             ->getQuery()
             ->getArrayResult();

这将只查询根实体

【讨论】:

但我正在使用 ->leftJoin('p.content', 'c') 将 Content 实体连接到另一个实体。有没有办法我可以这样做? 如果这是您的意思,您可以在 select 子句中指定要选择的内容 - 检查我的编辑 我的意思是我在一个完全不同的实体的存储库中,它与内容有关系,这就是为什么我用'->leftJoin('将内容加入到那里p.content', 'c')' (其中 p 是我当前所在的存储库的实体。 所以也许你应该做->leftJoin('p.OtherEntityExtendingContent', 'c')而不是加入抽象类Content【参考方案2】:

最后我自己编写了整个 SQL 语句,因为在加入多个实体时,没有办法只加入它们的基实体,而不是实际的继承类。

编辑:与学说的开发人员交谈,自己编写 SQL 语句是要走的路。

【讨论】:

以上是关于学说(连接)类表继承中根实体的查询字段的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

与学说 dql 连接的子查询

尝试在 zf2 / 学说下的实体之间创建继承时出现“找不到类”