如何在Symfony的ORM中实现findOneBy方法的OR条件查询
Symfony Doctrine ORM 提供的findOneBy方法传入数组条件时默认拼接AND逻辑,要实现OR条件查询,你可以通过QueryBuilder构造自定义查询实现,常用实现方案如下:
方案1:直接在当前逻辑中构造查询
该方案适合单次使用的查询场景,和原有findOneBy行为完全兼容:
$targetValue = $data->user_data->hash; $user_test = $em->getRepository("AppBundle:UserTest") ->createQueryBuilder('ut') ->where('ut.hash = :val') ->orWhere('ut.code = :val') ->setParameter('val', $targetValue) ->getQuery() ->getOneOrNullResult();
说明:使用getOneOrNullResult替代getSingleResult,可以避免无匹配结果时抛出异常,和原生findOneBy的返回逻辑一致
方案2:封装到自定义Repository复用
如果该查询逻辑需要多次调用,建议将其封装到对应实体的Repository类中,提升代码复用性:
- 首先在UserTestRepository类中添加自定义方法:
// AppBundle/Repository/UserTestRepository.php namespace AppBundle\Repository; use Doctrine\ORM\EntityRepository; class UserTestRepository extends EntityRepository { public function findOneByHashOrCode(string $value) { return $this->createQueryBuilder('ut') ->where('ut.hash = :val') ->orWhere('ut.code = :val') ->setParameter('val', $value) ->getQuery() ->getOneOrNullResult(); } }
- 业务逻辑中直接调用封装好的方法即可:
$user_test = $em->getRepository("AppBundle:UserTest") ->findOneByHashOrCode($data->user_data->hash);
补充:复杂条件下的表达式写法
如果后续需要叠加更多AND/OR组合条件,可以使用Doctrine表达式写法,逻辑更清晰规范:
$qb = $em->getRepository("AppBundle:UserTest")->createQueryBuilder('ut'); $user_test = $qb ->where($qb->expr()->orX( $qb->expr()->eq('ut.hash', ':val'), $qb->expr()->eq('ut.code', ':val') )) ->setParameter('val', $data->user_data->hash) ->getQuery() ->getOneOrNullResult();
内容的提问来源于stack exchange,提问作者user17027205
相关产品推荐
相关产品推荐

