【问题标题】:Doctrine query buider with a where clause for a related entity field具有相关实体字段的 where 子句的 Doctrine 查询构建器
【发布时间】:2012-11-03 11:13:10
【问题描述】:

我有两个实体:ImageTags,具有多对多关系。

Image 有一些字段:codedescriptionauthortags,它们实现了多对多关系。

Tag 只有两个字段:nameimages

我正在构建一个非常通用的搜索表单,只有一个输入字段,您可以在其中编写任何文本,然后它将返回任何在其 codedescription 或 @987654334 中包含该文本的 Image @ 字段,或其任何标签中的 name 字段。

对于非关系字段,这很容易。我的控制器中有(query 只是用于搜索的 de GET 参数):

$em = $this->getDoctrine()->getManager();

$qb = $em->getRepository('MyBundle:Image')->createQueryBuilder('i');

$qb
->where(
      $qb->expr()->like('i.code', $qb->expr()->literal('%'.$request->get('query').'%'))
      )
->orWhere(
      $qb->expr()->like('i.description', $qb->expr()->literal('%'.$request->get('query').'%'))
      )
->orWhere(
      $qb->expr()->like('i.author', $qb->expr()->literal('%'.$request->get('query').'%'))
      );

现在,我不知道如何处理 tags 的每个 name 字段。

我曾尝试在Image 实体中使用一个虚拟字段,该字段将所有标签作为字符串返回,但我稍后无法在查询生成器中使用它。

非常感谢!

【问题讨论】:

    标签: symfony doctrine-orm symfony-2.1 doctrine-query


    【解决方案1】:
    SELECT i FROM YourBundle:Image i
    LEFT JOIN i.tags t
    WHERE i.code LIKE :q OR i.desc LIKE :q OR i.author LIKE :q OR t.name LIKE :q
    

    这应该可行。

    带qb:

    $qb->leftJoin('i.tags', 't')
       ->where($qb->expr()->like('t.name', $qb->expr()->literal('%' . $query . '%')));
    

    【讨论】:

    • +1。感谢您的回答。这样就行了。但我更喜欢使用查询生成器而不是 DQL。我认为一个好的 ORM 应该鼓励以面向对象的方式工作。如果没有其他人使用查询生成器提出替代方案,我会将您的答案设置为正确的。
    • 我发现它有问题。使用这种方式,搜索时不考虑没有标签的图像。
    • 那么应该有 LEFT JOIN。
    猜你喜欢
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 2021-10-30
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多