在我的Symfony2项目中,我有一个这样的查询:
$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
中?
非常感谢。
修改
我现在做了什么:
$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.'%');
但为什么Query构建器不使用实体及其关系?
答案 0 :(得分:3)
出于性能原因,默认行为不会加载相关实体的字段,它只提供与OBJECT水合作用的那些关系的代理类(即默认的水合模式)。
你必须像你一样说出JOIN。
编辑:当您从控制器执行$p->getSection()->getName()
或从Twig模板执行p.section.name
时,如果未在查询中声明JOIN(使用默认的QueryBuilder),则说明请求此时关系信息丢失。如果你在循环中这样做,那可能会非常沉重,就像在列表显示中那样...所以尝试在第一次请求时从关系中加载你需要的东西;)