首页 文章

在Symfony项目中使用“类表继承”与Doctrine连接太多

提问于
浏览
2

我正在使用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 回答

  • 0

    那么,大问题因为是mysql limitation . 我不明白为什么如果你没有要求那么教义正在做左连接 . 如果您只需要与主实体相关的数据,则会将select更改为这些特定字段:

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

    希望这对你有所帮助 .

  • 0

    通过文件

    类表继承是一种继承映射策略,其中层次结构中的每个类都映射到多个表 .

    在这里看起来你有一些基类,然后是一堆扩展它的类,并为它添加一些非常不同的属性 .

    我对类表继承的使用并不是很熟悉,但在这里看起来它的设计特性和使用方式之间存在差异 .

  • 0

    看起来你已经破了one of the main rules of Doctrine's CTI:不要对类层次结构进行协调 . 在你的情况下,你've done a parent-child association and that'为什么Doctrine产生了太多的JOINS . 我想,它试图将你所有的孩子实体加入到父母那里 . 我认为你应该避免在同一个实体上与CTI Build 亲子关系 .

相关问题