我在 Document 和 Tag 之间有一个多对多的关系。所以一个Document
可以有多个Tags
,一个Tag
可以分配给不同的Document
。
这是标签
AppBundle\Entity\Tag:
type: entity
table: tags
repositoryClass: AppBundle\Repository\TagRepository
manyToMany:
documents:
targetEntity: Document
mappedBy: tags
id:
id:
type: integer
id: true
generator:
strategy: AUTO
fields:
label:
type: string
length: 255
unique: true
和文档
AppBundle\Entity\Document:
type: entity
table: documents
repositoryClass: AppBundle\Repository\DocumentRepository
manyToMany:
tags:
targetEntity: Tag
inversedBy: documents
joinTable:
name: documents_tags
id:
id:
type: integer
id: true
generator:
strategy: AUTO
fields:
title:
type: string
length: 255
现在我想搜索所有具有标签 animal
和 fiction
的文档。我如何通过 Doctrine 实现这一目标?
类似
$repository = $this->getDoctrine()->getRepository('AppBundle:Document');
$query = $repository->createQueryBuilder('d');
$query ->join('d.tags', 't')
->where($query->expr()->orX(
$query->expr()->eq('t.label', ':tag'),
$query->expr()->eq('t.label', ':tag2')
))
->setParameter('tag', $tag)
->setParameter('tag2', $tag2)
不会完成这项工作,因为它会返回所有具有 tag1
或 tag2
的文档。但是 andX
也不起作用,因为没有一个标签同时具有两个标签。
最佳答案
您可以通过为每个标签添加额外的内部连接来实现此目的:
例子:
$em = $this->getDoctrine()->getManager();
$repository = $this->getDoctrine()->getRepository('AppBundle:Document');
$query = $repository->createQueryBuilder('d');
$query->innerJoin('d.tags', 't1', Join::WITH, 't1.label = :tag1');
$query->innerJoin('d.tags', 't2', Join::WITH, 't2.label = :tag2');
$dql = $query->getDql();
$result = $em->createQuery($dql)
->setParameter('tag1', 'LabelForTag1')
->setParameter('tag2', 'LabelForTag2')
->getResult();
也许这张小图有助于理解这个查询的作用。整个圆圈代表您的所有文件。如果您只使用一个连接,则查询将返回绿色+红色或蓝色+红色部分。 使用额外的内连接,您只会得到单独看到的连接的交集(这只是红色部分)。
如果您有更多标签要搜索,您可以简单地为此添加另一个联接。
关于symfony - 在 Doctrine 中搜索具有多个标签的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44853628/