Reputation: 20223
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
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