Doctrine ORM Form \ Element \ ObjectMultiCheckbox的性能问题,具有非常大的集合

时间:2015-07-29 17:01:53

标签: php performance doctrine-orm zend-framework2

我与一个实体(Fair< - > Hotels)有超过12.000个条目的ManyToMany关系。当我在表单中使用DoctrineModule \ Form \ Element \ ObjectMultiCheckbox时,应用程序内存不足。看起来ObjectMultiCheckbox加载了保存在数据库中的每个实体,即使公平实体没有分配给任何酒店(反之亦然)。

以下是具有酒店关系的公平实体:

/**
 * @ORM\ManyToMany(targetEntity="Hotel", fetch="EXTRA_LAZY")
 * @ORM\JoinTable(name="fair_core_has_hotel", joinColumns={@ORM\JoinColumn(name="fair_core_id", referencedColumnName="id")})
 */  
private $hotel;

这是FairForm中的ObjectMultiCheckbox:

$this->add(array(
    'name' => 'hotel',
    'type' => 'DoctrineModule\Form\Element\ObjectMultiCheckbox',
    'options' => array(
        'entity' => 'hotel',
        'unchecked_value' => '',
        'object_manager' => $em,
        'target_class' => 'Customer\Entity\Hotel',
        'label_generator' => function($targetEntity) {
            return "".$targetEntity->getLabel();
        },
        'attributes' => array('required' => false),
    ),
));

已经尝试将获取模式更改为EXTRA_LAZY,但它没有任何区别。这种关系也是单向的,酒店实体对公平实体一无所知。

有什么解决方案吗?或者我做错了什么?

以下是我目前正在使用的模块: enter image description here

1 个答案:

答案 0 :(得分:1)

我认为你误解了学说ObjectMultiCheckbox表单元素的工作。 在the Doctrine2 form element documentation中,您可以阅读:

  

表单呈现时,findAll的{​​{1}}方法将默认执行。

在您的情况下,这意味着它将找到目标类ObjectRepository的所有实体,因此这意味着所有12.000条记录。

难怪记忆存在一些问题:)

我认为您必须重构这部分代码,以便它只适用于一系列酒店。

您可以在Example 3: extended version中了解如何执行此操作。在那里,他们展示了一个示例,他们配置了'Customer\Entity\Hotel',它使用您的存储库中的特定方法来限制结果。