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

如何在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类中,提升代码复用性:

  1. 首先在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();
    }
}
  1. 业务逻辑中直接调用封装好的方法即可:
$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:48:02