2015-07-29 2 views
0

У меня есть отношение ManyToMany к объекту (Fair < -> Hotels) с более чем 12 000 записей. Когда я использую DoctrineModule \ Form \ Element \ ObjectMultiCheckbox в моей форме, у приложения заканчивается память. Кажется, что ObjectMultiCheckbox загружает каждый отдельный объект, который сохраняется в базе данных, даже если объект «Ярмарка» не назначен ни одному из отелей (и наоборот).Ошибка производительности с помощью Doctrine ORM Form Element 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; 

А вот ObjectMultiCheckbox в FairForm:

$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

+0

Сколько фотографий в отеле у вас есть? Являются ли ваши отношения между ярмаркой и гостиницей однонаправленными? Если нет, пожалуйста, покажите другую сторону. – Wilt

+0

У меня есть около 12.000 записей о гостинице. Отношение однонаправлено. Прокси-сервер Doctrine (DoctrineModule \ Form \ Element \ Proxy) загружает каждую запись в метод loadObjects(), поэтому он сбой. Может быть, я могу попробовать его с определением собственного метода find_method в настройках. – Sepultura

+0

Так исправьте меня, если я понимаю, что вы ошибаетесь, но вы хотите сделать список с несколькими выборами с 12 000 отелями на выбор? – Wilt

ответ

1

Я думаю, вы непонимание работы элемента формы доктрины ObjectMultiCheckbox. В the Doctrine2 form element documentation вы можете прочитать, что:

Когда форма визуализируется в findAll метод ObjectRepository будет выполняться по умолчанию.

В вашем случае это означает, что он найдет все объекты целевого класса 'Customer\Entity\Hotel', так что это означает все 12.000 записей.

Не удивительно, что есть некоторые проблемы с памятью :)

Я думаю, что вам придется реорганизовать эту часть кода, так что будет работать только с выбором отелей.

Вы можете прочитать о том, как это сделать в Example 3: extended version. Там они показывают пример, где они настраивают find_method, который использует определенный метод из вашего репозитория, где вы можете ограничить результат.

+0

Вы абсолютно правы, это поведение по умолчанию, чего я не понял. Я могу определить свой собственный метод findBy, чтобы ограничить результаты поиска. Спасибо что подметил это. – Sepultura

Смежные вопросы