2013-07-02 5 views
2

В моем Symfony2 проекта, у меня есть запрос, как это:Symfony2 и Doctrine2 - QueryBuilder с реляционными лицами

$paperQB = $this->createQueryBuilder('p') 
     ->select('p') 
     ->where("p.title LIKE :q OR p.keywords LIKE :q OR p.abstract LIKE :q OR p.id LIKE :q") 
     ->setFirstResult($first_result) 
     ->setMaxResults($papers_per_page) 
     ->orderBy($sort_by_culumn, $sort_by_order) 
     ->setParameter('q', '%'.$q.'%'); 

Все хорошо, но в моей работе лица, у меня есть много, чтобы одно соотношение с . Таким образом, я хотел бы получить также:

"OR p.section.name LIKE :q"

Как это возможно, я должен использовать присоединиться для того, чтобы сделать это? Запрос bilder не знает, как использовать эти отношения, как в контроллере: $p->getSection()->getName() или на ветке p.section.name?

Большое спасибо.

EDIT:

То, что я сделал на данный момент:

$paperQB = $this->createQueryBuilder('p') 
     ->select('p') 
     ->where("p.title LIKE :q OR p.keywords LIKE :q OR p.abstract LIKE :q OR p.id LIKE :q OR s.name LIKE :q OR c.name_full LIKE :q") 
     ->leftJoin('p.conference', 'c') 
     ->leftJoin('p.section', 's') 
     ->setFirstResult($first_result) 
     ->setMaxResults($papers_per_page) 
     ->orderBy($sort_by_culumn, $sort_by_order) 
     ->setParameter('q', '%'.$q.'%'); 

Но почему конструктор запросов не использует объекты и их отношения?

ответ

3

По умолчанию поведение по умолчанию не загружает поля связанных сущностей, оно предоставляет только прокси-класс этих отношений с гидратацией OBJECT (это режим гидратации по умолчанию).

Вы должны указать JOIN, как вы хорошо это сделали.

EDIT: Когда вы $p->getSection()->getName() от контроллера или p.section.name из шаблона Twig, не высказав Соединить в запросе (с по умолчанию QueryBuilder), Doctrine запрашивает недостающую информацию о связи в это время. Это может быть очень тяжелым, если вы делаете это в цикле, например, в режиме отображения списка. Поэтому постарайтесь загрузить то, что вам нужно, из отношений при первом запросе;)

+0

Благодарим вас за ответ. –

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