我正在使用Symfony和Doctrine,我最终遇到了以下错误:
SQLSTATE [HY000]:常规错误:1116表太多; MySQL只能在连接中使用61个表
主实体(层次结构的最顶层表)包含超过61个实体的鉴别器映射 . “多对多”关联是针对自身的,因此实体可以作为父母或孩子与其他人联系 .
Here is the Entity Doctrine annotation :
/**
* Entity
*
* @ORM\Table(name="entity")
* @ORM\Entity(repositoryClass="Acme\EntityBundle\Repository\EntityRepository")
* @InheritanceType("JOINED")
* @DiscriminatorColumn(name="type", type="string")
* @DiscriminatorMap({
* "sub_entity_1" = "\Acme\SubEntityABundle\Entity\E1",
* "sub_entity_2" = "\Acme\SubEntityABundle\Entity\E2",
* ...
* })
*/
class Entity
{
/**
* @ORM\ManyToMany(targetEntity="Entity", inversedBy="parentEntities")
* @ORM\JoinTable(name="rel_entity_entity",
* joinColumns={@ORM\JoinColumn(name="parent", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="child", referencedColumnName="id")}
* )
*/
private $childrenEntities;
/**
* @ORM\ManyToMany(targetEntity="Entity", mappedBy="childrenEntities")
*
*/
private $parentEntities;
/**
* Get children entities
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getChildrenEntities()
{
return $this->childrenEntities;
}
/**
* Set childrenEntities
*
* @param ArrayCollection $entities
*/
public function setchildrenEntities(ArrayCollection $entities)
{
$this->childrenEntities = $entities;
}
...
}
每当我在formType中使用查询生成器来获取一些经典实体的列表(甚至不扩展顶级“实体”)时,Doctrine将对鉴别器映射中的每个实体执行左连接(并生成一般错误MySQL的) .
FormType :
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('childrenEntities', 'entity', array(
'class' => 'AcmeEntityBundle:Entity',
'required' => false,
'choice_label' => 'slug', // slug is defined as a main entity's attribute
'query_builder' => function (EntityRepository $er) {
return $er->getSomeEntities();
},
));
...
}
EntityRepository :
public function getSomeEntities()
{
return $this->getEntityManager()
->createQueryBuilder()
->select('e')
->from('AcmeEntityBundle:Entity', 'e')
->where('e.id IN (:ids)')
// Tried that, doesn't work
//->andWhere('e INSTANCE OF AcmeEntityBundle:Entity')
->setParameter('ids', [53300, 12345]);
}
有没有办法告诉学说不要加入?我只需要主实体的属性,例如id或slug,所以我不需要子类的任何值
学说版本是: 2.4
我读过一些有用的文档:
谢谢!
3 回答
那么,大问题因为是mysql limitation . 我不明白为什么如果你没有要求那么教义正在做左连接 . 如果您只需要与主实体相关的数据,则会将select更改为这些特定字段:
希望这对你有所帮助 .
通过文件
在这里看起来你有一些基类,然后是一堆扩展它的类,并为它添加一些非常不同的属性 .
我对类表继承的使用并不是很熟悉,但在这里看起来它的设计特性和使用方式之间存在差异 .
看起来你已经破了one of the main rules of Doctrine's CTI:不要对类层次结构进行协调 . 在你的情况下,你've done a parent-child association and that'为什么Doctrine产生了太多的JOINS . 我想,它试图将你所有的孩子实体加入到父母那里 . 我认为你应该避免在同一个实体上与CTI Build 亲子关系 .