symfony - 在 Doctrine 中搜索具有多个标签的实体

标签 symfony doctrine

我在 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

现在我想搜索所有具有标签 animalfiction 的文档。我如何通过 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)

不会完成这项工作,因为它会返回所有具有 tag1tag2 的文档。但是 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();

也许这张小图有助于理解这个查询的作用。整个圆圈代表您的所有文件。如果您只使用一个连接,则查询将返回绿色+红色或蓝色+红色部分。 使用额外的内连接,您只会得到单独看到的连接的交集(这只是红色部分)。

enter image description here

如果您有更多标签要搜索,您可以简单地为此添加另一个联接。

关于symfony - 在 Doctrine 中搜索具有多个标签的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44853628/

相关文章:

php - Symfony Doctrine i18n 行为数据加载失败 : Integrity constraint violation

php - Symfony 2 的 Jobeet

orm - 在 Controller 上捕获 Doctrine 异常

php - Doctrine 认为它已经创建了一个表,但它并没有

mysql - Doctrine 路径设置

php - Zend + 表关系上的 Doctrine 错误

php - 一个 php 平台安装问我国际扩展,但它似乎已经安装

php - 如何检查配置参数是否存在?

javascript - 使用 Angularjs 从后端获取所选选项

php - ES 5.5.1 [size]查询格式错误,查询名称后没有start_object