Milos Cuculovic
Milos Cuculovic

Reputation: 20223

Symfony2 and Doctrine2 - QueryBuilder with relational entities

In my Symfony2 project, I have a query like this:

$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.'%');

Everything is fine there, but In my paper entity, I have a many to one relation with the section entity. So, I would like to get also:

"OR p.section.name LIKE :q"

How is this possible, should I use a join in order to do that? The query bilder does not know how to use those relations as in the controller: $p->getSection()->getName() or in the twig p.section.name?

Thanks a lot.

EDIT:

What I did for the moment:

$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.'%');

But why Query builder does not use entities and their relations ?

Upvotes: 2

Views: 5373

Answers (1)

AlterPHP
AlterPHP

Reputation: 12717

Default behaviour does not load related entities' fields for performance reasons, it only provides a proxy class of those relations with OBJECT hydratation (that is default hydratation mode).

You have to state the JOIN as you well did.

EDIT: When you do $p->getSection()->getName() from a Controller or p.section.name from a Twig template, without having stated the JOIN in the query (with default QueryBuilder), Doctrine requests missing informations of the relation at this time. That could be very heavy if you do that in a loop, like in a list display... So try to load what you need from relations at first request ;)

Upvotes: 3

Related Questions