如何在Symfony中通过多个ID查询已填写Poll的用户?
解决Symfony查询已填写特定Poll字段用户的问题
嘿,我来帮你搞定这个查询需求!你现在的思路是对的,但需要先把PollResult集合里的用户ID提取出来(还要去重),再用这些ID查询用户。下面给你两种可行的方案:
方案一:分步提取ID再查询(直观易懂)
首先从你拿到的$oneFieldsPollResults里提取所有不重复的用户ID,然后用这些ID查询User实体:
// 从PollResult集合中提取不重复的用户ID $userIds = array_unique(array_map(function(PollResult $result) { // 这里假设你的PollResult实体关联了User,并且有getUser()方法 return $result->getUser()->getId(); // 如果PollResult里直接存的是user_id字段,就改成return $result->getUserId(); }, $oneFieldsPollResults)); // 根据用户ID集合查询所有符合条件的用户 $counting_users = $this->getDoctrine()->getRepository(User::class)->findBy(['id' => $userIds]);
方案二:用QueryBuilder一步查询(更高效)
上面的方法需要两次数据库查询,如果你想优化性能,可以用Doctrine的QueryBuilder直接一次查询完成,还能自动帮你去重:
假设User实体和PollResult是双向关联(User有pollResults属性)
$userRepo = $this->getDoctrine()->getRepository(User::class); $counting_users = $userRepo->createQueryBuilder('u') // 关联用户对应的PollResult记录 ->innerJoin('u.pollResults', 'pr') // 筛选出对应字段的PollResult ->where('pr.field = :fieldId') ->setParameter('fieldId', $campaign->getOneFieldId()) // 确保同一个用户只返回一次 ->distinct() ->getQuery() ->getResult();
如果是单向关联(只有PollResult关联User)
也可以从PollResult出发查询:
$pollResultRepo = $this->getDoctrine()->getRepository(PollResult::class); $counting_users = $pollResultRepo->createQueryBuilder('pr') // 明确要查询User实体 ->select('u') ->innerJoin('pr.user', 'u') ->where('pr.field = :fieldId') ->setParameter('fieldId', $campaign->getOneFieldId()) ->distinct() ->getQuery() ->getResult();
这个方案只需要一次数据库查询,性能更优,也更符合Doctrine的最佳实践哦!
内容的提问来源于stack exchange,提问作者lxg95
相关产品推荐
相关产品推荐

