gpt4 book ai didi

php - 在 Symfony 项目上使用 "Class Table Inheritance"加入 Doctrine 太多

转载 作者:行者123 更新时间:2023-11-29 03:24:27 34 4
gpt4 key购买 nike

我在使用 Symfony 和 Doctrine 时遇到了以下错误:

SQLSTATE[HY000]: General error: 1116 Too many tables; MySQL can only use 61 tables in a join`

主要实体(层次结构的最顶层表)包含超过 61 个实体的鉴别器映射。 “多对多”关联是建立在自身之上的,因此实体可以作为父实体或子实体与其他实体关联。

这是实体 Doctrine 注释:

/**
* 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的一般错误)。

表单类型:

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();
},
));

...
}

实体库:

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]);
}

有没有办法告诉 doctrine 不要做任何连接?我只需要主实体的属性,例如 id 或 slug,所以我不需要子类的任何值

Doctrine 版本是:2.4

我阅读的一些有用的文档:

谢谢!

最佳答案

嗯,大问题,因为是 mysql limitation .如果您不要求,我不明白为什么 Doctrine 要进行左连接。如果您只需要与主要实体相关的数据,他们会将选择更改为那些特定字段:

->select('e.id, e.slug, ...')

希望对你有帮助。

关于php - 在 Symfony 项目上使用 "Class Table Inheritance"加入 Doctrine 太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38664540/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com