我有两个实体:Image
和Tags
,具有多对多关系。
Image
有一些字段:code
、description
、author
和tags
,它们实现了多对多关系。
Tag
只有两个字段:name
和images
。
我正在构建一个非常通用的搜索表单,只有一个输入字段,您可以在其中编写任何文本,然后它将返回在其code
、description
或author
字段中具有该文本的任何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
实体中使用一个虚拟字段,该字段将所有标签作为字符串返回,但稍后无法在查询构建器中使用它。
多谢!
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 . '%')));