具有相关实体字段的where子句的Doctrine查询构建器

时间:2012-11-03 11:13:11

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

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

Image包含一些字段:codedescriptionauthortags,用于实现多对多关系。

Tag只有两个字段:nameimages

我正在构建一个非常通用的搜索表单,只有一个输入字段,您可以在其中编写任何文本,然后将返回Image code中包含该文本的任何description。{ 1}}或author字段,或其任何标记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').'%'))
      );

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

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

非常感谢!

1 个答案:

答案 0 :(得分:2)

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 . '%')));