Symfony2和Doctrine2 - 具有关系实体的QueryBuilder

时间:2013-07-02 12:01:49

标签: php symfony doctrine-orm query-builder

在我的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构建器不使用实体及其关系?

1 个答案:

答案 0 :(得分:3)

出于性能原因,默认行为不会加载相关实体的字段,它只提供与OBJECT水合作用的那些关系的代理类(即默认的水合模式)。

你必须像你一样说出JOIN。

编辑:当您从控制器执行$p->getSection()->getName()或从Twig模板执行p.section.name时,如果未在查询中声明JOIN(使用默认的QueryBuilder),则说明请求此时关系信息丢失。如果你在循环中这样做,那可能会非常沉重,就像在列表显示中那样...所以尝试在第一次请求时从关系中加载你需要的东西;)