1

我正在创建一个应用程序,该应用程序具有一个与其他对象具有多个多对多关系的实体。让我布置实体:

  • 入口=主要对象
  • Region = 通过“_entry_region”引用表与条目具有多对多
  • Type = 通过“_entry_type”引用表与条目具有多对多
  • Tag = 通过“_entry_tag”引用表与条目具有多对多

现在在前端,用户可以为需要加载的条目设置一些过滤器。在人类语言中,查询需要是这样的。

Get the entries WHERE  region is (1 or 2 or 3) AND type is ( 3 or 4 or 5 ) AND tag is ( 4 OR 6 or 1)

我目前正在努力使用这段代码:

$query = $this->em->createQuery('SELECT m.id FROM Entity\Entry e WHERE :region_id MEMBER OF e.regions);
$query->setParameter('region_id',  1);      
$ids = $query->getResult();

这给了我相应区域的条目的 ID。但不可能在 setParameter() 中添加区域 ID 的数组。我也无法在文档中找到如何在多个相关实体上执行此操作,例如基于人类的查询:

Get the entries WHERE  region is (1 or 2 or 3) AND type is ( 3 or 4 or 5 ) AND tag is ( 
4

1 回答 1

4

您还可以考虑查看 D2 查询生成器。稍微冗长一些,但是一旦你掌握了语法,构建更复杂的查询就会容易得多。

就像是:

    $qb = $this->em->createQueryBuilder();

    $qb->addSelect('entry');
    $qb->addSelect('region');
    $qb->addSelect('type');
    $qb->addSelect('tag');

    $qb->from('MyBundle:Entry',   'entry');
    $qb->leftJoin('entry.regions','region');
    $qb->leftJoin('entry.types',  'type');
    $qb->leftJoin('entry.tags',   'tag');


    $qb->andWhere($qb->expr()->in('region.id',$regions));
    $qb->andWhere($qb->expr()->in('type.id',  $types));
    $qb->andWhere($qb->expr()->in('tag.id',   $tags));
于 2012-06-01T14:02:25.823 回答