You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 20:48:11