我有一个名为Content的实体。这是我所有其他内容相关实体的抽象基类。
/**
* MyBundleEntityContent
*
* @ORMEntity(repositoryClass="MyBundleRepositoryContentRepository")
* @ORMInheritanceType("JOINED")
* @ORMDiscriminatorColumn(name="discr", type="string")
* @ORMTable(name="MyBundle_content")
* @ORMHasLifecycleCallbacks
*/
abstract class Content
内容属性:
- id
- 更新
此外,我有很多不同的实体,它们都扩展了Content。
在我的存储库中(另一个非内容且未扩展内容的实体),我有一个相当复杂的查询,我想在其中选择所有内容对象的"更新"字段(取决于其他一些未发布的内容)
编辑:但是Content实体与该查询中带有"->leftJoin('.Content','c')"的另一个实体相连。我的意思是,我在一个完全不同的实体的存储库中,该实体只与内容有关系,这就是为什么我使用"->leftJoin('.Content','c')"(其中p是我当前所在存储库的实体。
问题是,在该查询原则中,连接了将内容扩展到内容表的每个实体。因为我有很多实体,我得到的错误是
General error: 1116 Too many tables; MySQL can only use 61 tables in a join
在我的情况下,我不需要所有这些联接的表,因为我需要的信息仅在内容表中。
有没有办法只查询根实体表,同时仍然使用querybuilder而不编写自己的sql?
是的,有:
$result = $this->em->getRepository('MyBundle:Content')
->createQueryBuilder('c')
->select('c')
->leftJoin('c.Other', 'p')
->getQuery()
->getArrayResult();
这将只查询根实体
最后,我自己编写了整个SQL语句,因为在连接多个实体时,不可能只连接它们的基实体,而不是实际的继承类。
编辑:与条令的开发人员交谈,自己编写SQL语句是最好的选择。