如何在Doctrine Collection中查询指定玩家团队记录,无则返回默认团队?
解决Doctrine Collection中按优先级查找对象的问题
根据你的需求,有两种常用实现方式,分别适用于不同场景:
1. 操作已加载到内存的Collection
如果这批对象已经被加载到Doctrine Collection中,可以直接利用Collection的内置方法按优先级查找:
// 优先查找player=3且team=2的对象 $targetItem = $collection->findOneBy(['player' => 3, 'team' => 2]); // 若目标团队的对象不存在,则 fallback 到默认团队(team=0) if (!$targetItem) { $targetItem = $collection->findOneBy(['player' => 3, 'team' => 0]); }
如果你的Doctrine版本不支持findOneBy方法,可以用filter替代:
// 筛选目标团队对象 $targetItems = $collection->filter(function ($item) { return $item->getPlayer() === 3 && $item->getTeam() === 2; }); $targetItem = $targetItems->first(); // 不存在则取默认团队对象 if (!$targetItem instanceof YourEntityClass) { $defaultItems = $collection->filter(function ($item) { return $item->getPlayer() === 3 && $item->getTeam() === 0; }); $targetItem = $defaultItems->first(); }
2. 直接从数据库查询(更高效)
如果还未将对象加载到内存,推荐直接用QueryBuilder构造查询,通过排序确保优先级,一次查询即可得到结果:
use Doctrine\ORM\EntityManagerInterface; // 假设$entityManager是你的EntityManager实例 $targetItem = $entityManager->getRepository(YourEntityClass::class) ->createQueryBuilder('e') ->where('e.player = :player') ->setParameter('player', 3) // 限定只查询目标团队和默认团队 ->andWhere('e.team IN (:teams)') ->setParameter('teams', [2, 0]) // 排序规则:team=2的结果排在最前面 ->orderBy('CASE WHEN e.team = 2 THEN 0 ELSE 1 END', 'ASC') ->setMaxResults(1) ->getQuery() ->getOneOrNullResult();
这种方式避免了加载无关数据,在数据量较大时性能更优。
内容的提问来源于stack exchange,提问作者John Miller
相关产品推荐
相关产品推荐

