2013-10-03 3 views
1

У меня есть к таблицамSymfony2 OneToMany не использует пользовательский репозиторий класса

preset_item ID

и

preset_item_element preset_item_id -> ссылка на prese_item элементом ELEMENT_TYPE ELEMENT_ID

в PresetItemElement лица есть:

/** 
* @var \GGG\ManagerBundle\Entity\PresetItem 
* 
* @ORM\ManyToOne(targetEntity="GGG\ManagerBundle\Entity\PresetItem", inversedBy="elements") 
* @ORM\JoinColumns({ 
* @ORM\JoinColumn(name="preset_item_id", referencedColumnName="id") 
* }) 
*/ 
private $presetItem; 

и PresetItem

/** 
* @ORM\OneToMany(targetEntity="PresetItemElement", mappedBy="presetItem") 
*/ 

private $elements; 

public function getElements() 
{ 
    return $this->elements; 
} 

И заданный элемент имеет пользовательский Repository класс:

/** 
* PresetItem 
* 
* @ORM\Table(name="preset_item") 
* @ORM\Entity(repositoryClass="GGG\ManagerBundle\Entity\PresetItemRepository") 
*/ 
class PresetItem 

это выглядит следующим образом:

<?php 
namespace GGG\ManagerBundle\Entity; 
use Doctrine\ORM\EntityRepository; 
use Doctrine\DBAL\LockMode; 
class PresetItemElementRepository extends EntityRepository 
{ 
    public function findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null) { 
     return $this->decorate(parent::findBy($criteria, $orderBy, $limit, $offset)); 
    } 

    public function find($id, $lockMode = LockMode::NONE, $lockVersion = null) { 
     return $this->decorateElement(parent::find($id, $lockMode, $lockVersion)); 
    } 

    public function findOneBy(array $criteria, array $orderBy = null) { 
     return $this->decorateElement(parent::findOneBy($criteria, $orderBy)); 
    } 



    private function decorateElement($element) { 
     $object = $this->getEntityManager() 
        ->getRepository(
          'GGGManagerBundle:'.$element 
          ->getPresetItemElementType() 
          ->getRepresentationObject() 
        )->findOneBy(array('id' => $element->getElementId())); 
     $element->setObject($object); 
    } 


    private function decorate($elements) { 

     foreach($elements as $element) { 
      $this->decorateElement($element); 
     } 
     return $elements; 
    } 
} 

Так что я украшающие каждый PresetItemElement с некоторые дополнительные данные

и это работа, когда я, получаю один объект PresetItemElement, но когда я получаю PresetItem и попытаться итерацию getElements()

$entity = $em->getRepository('GGGManagerBundle:PresetItem')->find($id); 

    foreach($entity->getElements() as $a) { 
     var_dump($a->getObject()); 
    } 

я нуль здесь, похоже, обычай PresetItemElementRepository не был выполнен

Что я делаю неправильно?

ответ

0

Doctrine не использует репозитории внутри себя при загрузке связанных объектов. Кроме того, при использовании, например, запроса или построителя запросов для извлечения сущностей, репозиторий также не будет использоваться.

Чтобы сделать что-либо каждый раз, когда сущность загружается из базы данных, вы должны зарегистрировать обработчик событий для события postLoad. См. http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html о том, как писать и регистрировать прослушиватели событий, и http://docs.doctrine-project.org/en/latest/reference/events.html#lifecycle-events для доступных событий жизненного цикла.

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