Doctrine orm 获取与多对多关联中相关实体字段的所有提供ID相匹配的实体列表
我正在尝试从数据库中获取一个用户列表,其中包含一个条件中的所有标记 用户实体与标记实体具有多对多关联 只有一个标记必须匹配的or版本正在使用以下代码工作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
$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)
;
这很有趣,但这不会使分页变得非常困难吗?