我与一个实体(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,但它没有任何区别。这种关系也是单向的,酒店实体对公平实体一无所知。
有什么解决方案吗?或者我做错了什么?
答案 0 :(得分:1)
我认为你误解了学说ObjectMultiCheckbox
表单元素的工作。
在the Doctrine2 form element documentation中,您可以阅读:
表单呈现时,
findAll
的{{1}}方法将默认执行。
在您的情况下,这意味着它将找到目标类ObjectRepository
的所有实体,因此这意味着所有12.000条记录。
难怪记忆存在一些问题:)
我认为您必须重构这部分代码,以便它只适用于一系列酒店。
您可以在Example 3: extended version中了解如何执行此操作。在那里,他们展示了一个示例,他们配置了'Customer\Entity\Hotel'
,它使用您的存储库中的特定方法来限制结果。