2015-06-03 2 views
1

У меня есть структура доктрины, как это.Доктрина 2: Связать объекты сущности без гидратации

/** 
* @ORM\Entity 
* @ORM\Table(name="entity_deviceProfile") 
*/ 
class DeviceProfile 
{ 
    /** 
    * @ORM\ManyToMany(targetEntity="TranscodeProfile", inversedBy="deviceProfiles") 
    * @ORM\JoinTable(name="entity_deviceProfile_rel_transcodeProfiles_transcodeProfile") 
    * @var \Doctrine\Common\Collections\Collection 
    */ 
    protected $transcodeProfiles = null; 
} 

Я хочу иметь метод getTranscodeProfileCount() в DeviceProfile классе.

Так я добавляю следующую функцию DeviceProfile:

public function getTranscodeProfilesCount() { 
    if (!$this->transcodeProfiles->isInitialized()) { 
     $this->transcodeProfiles->initialize(); 
    } 
    return $this->transcodeProfiles->count(); 
} 

Она работает нормально, за исключением использования памяти и производительности. Увлажнение всей коллекции занимает много памяти и времени. У меня сто тысяч transcodeProfiles, и число растет.

Есть ли способ получить количество записей без увлажнения коллекции?

PS: Я знаю, что могу сделать это извне сущности, запустив запрос count() с $em. Но, к сожалению, эта функциональность является частью огромного приложения, и обновление всех вызовов функции - огромная работа. Поэтому я ищу способ решить проблему в рамках существующей функциональности.

ответ

1

Существует функция Doctrine 2 под названием 'Extra Lazy Associations', которая решила мою проблему.

Это именно то, что мне нужно. Для подсчета он не гидратирует коллекцию, а выполняет запрос count().

Вместе с Doctrine filters он позволяет легко фильтровать связанные объекты.

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