2015-09-04 2 views
3

Я пытаюсь соединить два объекта в один расширенном запросе в Учении 2. Я работаю с Zend Framework 2.Присоединения сущностей по запросу в Учении 2

К сожалению, у меня есть трудное время, чтобы найти головы и хвосты в том, что Я сейчас делаю.

Вот что я попал в ZF2:

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

Классификатор имеет 2 Entities:

Category 
    var id 
    var name 
    var objects 

Object 
    var id 
    var entityName 
    var module 
    var entityId 
    var category 

Category->objects привязан по ManyToOne к Object->category

Тогда мне нужно для привязки объекта вручную к Object-> entityId, я думаю, что я должен это сделать, используя join в Doctrine 2. Но я не уверен, с чего начать или как получить захват в теме. Надеюсь, кто-нибудь может заставить меня начать и показать мне в правильном направлении, я посмотрел документацию доктрины, но стал более смущенным, чем должен.

ответ

6

Существует несколько способов достижения желаемого.

1. Добавить fetch="EAGER в определении отношения

Для этого добавьте fetch="EAGER" к определению сущности в вашем Object.

/** MANY-TO-ONE, OWNING SIDE 
* @var Category 
* @ORM\ManyToOne(targetEntity="Application\Entity\Category", inversedBy="objects", fetch="EAGER") 
* @ORM\JoinColumn(name="category_id", referencedColumnName="id", nullable=true) 
*/ 
protected $category; 

жадная загрузка упоминается в документации here и here.


2. Написать пользовательский запрос DQL в вашем Object хранилище и сделать выборку присоединиться:

/** 
* Find object using DQL with a category joined. 
* 
* @param int $id 
* @return Building|null 
*/ 
public function findObject($id) 
{ 
    $entityManager = $this->getEntityManager(); 
    $query = $entityManager->createQuery(
     "SELECT o, c FROM Object o JOIN o.category c WHERE o.id = :id" 
    ); 
    $query->setParameter('id', $id); 
    $query->getOneOrNullResult(); 
} 

Такого рода объединений объясняются в документации here. Наблюдайте разницу между fetch-join и регулярными объединениями.


3. Или использовать Учение QueryBuilder в вашем Object хранилище, чтобы получить тот же результат:

/** 
* Find object using query builder with a category joined. 
* 
* @param int $id 
* @return Building|null 
*/ 
public function findObject($id) 
{ 
    $queryBuilder = $this->createQueryBuilder('o') 
     ->addSelect('c') 
     ->leftJoin('o.category', 'c') 
    } 
    return = $queryBuilder->getQuery()->getOneOrNullResult(); 
} 

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

+0

@ KatsuoRyuu Это ответ на ваш вопрос? – Wilt

+0

Извините за долгое ожидание, да, это отлично! – KatsuoRyuu

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