2

在我的 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()或在twig 中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 builder 不使用实体及其关系呢?

4

1 回答 1

3

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

您必须像您所做的那样声明 JOIN。

编辑:当您$p->getSection()->getName()从 Controller 或p.section.nameTwig 模板执行操作时,没有在查询中声明 JOIN(使用默认 QueryBuilder),Doctrine 此时请求缺少关系信息。如果您在循环中执行此操作(例如在列表显示中),那可能会非常繁重……因此,请尝试在第一次请求时从关系中加载您需要的内容;)

于 2013-07-02T12:42:07.287 回答