Doctrine orm 获取与多对多关联中相关实体字段的所有提供ID相匹配的实体列表

Doctrine orm 获取与多对多关联中相关实体字段的所有提供ID相匹配的实体列表,doctrine-orm,Doctrine Orm,我正在尝试从数据库中获取一个用户列表,其中包含一个条件中的所有标记 用户实体与标记实体具有多对多关联 只有一个标记必须匹配的or版本正在使用以下代码工作 $tagIds = array(29,30); $this->createQueryBuilder('u') ->select('u','t') ->leftJoin('u.tags','t') ->where("t IN(:tagIds)") ->setParameter("tag

我正在尝试从数据库中获取一个用户列表,其中包含一个条件中的所有标记

用户实体与标记实体具有多对多关联

只有一个标记必须匹配的or版本正在使用以下代码工作

$tagIds = array(29,30);
$this->createQueryBuilder('u')
    ->select('u','t')
    ->leftJoin('u.tags','t')
    ->where("t IN(:tagIds)")
    ->setParameter("tagIds",$tagIds)
;
有谁能帮我让它工作,这样所有的标签ID都必须匹配吗? 请记住,这是一个获取用户列表的查询,而不仅仅是一个用户,因此我想必须检查每个用户,看看他们是否匹配所有提供的标记ID


我尝试了很多查询,但到目前为止没有任何运气…

简单的暴力查询:

$tagIds = array(29,30);
$qb = $this->createQueryBuilder('u');
$qb
    ->select('u')
;

foreach($tagIds as $idx => $tagId)
{
  $joinAlias = "t{$idx}";
  $qb->leftJoin('u.tags', $joinAlias)
     ->addSelect($joinAlias)
     ->andWhere("{$joinAlias}.id = $tagId AND $joinAlias IS NOT NULL")
  ;
}
这是一个非常残酷且代价高昂的查询,您将每个标记作为一个单独的连接进行连接,如果您有很多用户和标记,这将需要很长时间才能执行


由于数据库是应用程序的瓶颈,您应该对数据库进行简单查询,然后解析应用程序中的数据,因此您应该使用查询,然后检查哪些用户的集合中有这两个标记。

好的。。。经过大量搜索,这似乎对我有效:

    $tagIds = array(29,30);
    $this->createQueryBuilder('u')
        ->select('u','t')
        ->leftJoin('u.tags','t')
        ->where("t IN(:tagIds)")
        ->groupBy('u.id')
        ->having('COUNT(DISTINCT t.id) = ' . count($tagIds))
        ->setParameter("tagIds",$tagIds)
    ;

这很有趣,但这不会使分页变得非常困难吗?