Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Doctrine2复杂的多对多搜索查询_Php_Symfony_Doctrine Orm_Many To Many_Dql - Fatal编程技术网

Php Doctrine2复杂的多对多搜索查询

Php Doctrine2复杂的多对多搜索查询,php,symfony,doctrine-orm,many-to-many,dql,Php,Symfony,Doctrine Orm,Many To Many,Dql,我正在创建一个应用程序,该应用程序具有一个与其他对象具有多对多关系的实体。让我来布置实体: Entry=主对象 区域=通过“\u Entry\u Region”参考表具有多对多条目 类型=通过“\u Entry\u Type”参考表具有多对多条目 Tag=通过“\u Entry\u Tag”参考表进行多对多输入 现在在前端,用户可以为需要加载的条目设置一些过滤器。在人类语言中,查询需要如下所示 Get the entries WHERE region is (1 or 2 or 3) AN

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

  • Entry=主对象
  • 区域=通过“\u Entry\u Region”参考表具有多对多条目
  • 类型=通过“\u Entry\u Type”参考表具有多对多条目
  • Tag=通过“\u Entry\u 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 ( 

您也可以考虑查看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));

您也可以考虑查看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));

这比我做的好多了,你不必担心消毒。这比我做的好多了,你不必担心消毒。