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