【问题标题】:Doctrine2 empty parameter on queryBuilderqueryBuilder 上的 Doctrine2 空参数
【发布时间】:2016-12-21 17:36:14
【问题描述】:

我正在尝试检查是否设置了用户电子邮件。我能够获得设置为 NULL 的那些,但我缺少具有空字符串作为值的那些。这是我的尝试:

$user = $this->createQueryBuilder('u')
        ->where('(u.email IS NULL OR u.email = :empty)')
        ->setParameter('empty', "''")
        ->getQuery()->getResult()
;

我收到 NULL 电子邮件没有问题,但我无法收到空字符串电子邮件。有什么方法可以做到这一点,还是 DQL 不支持?

【问题讨论】:

    标签: symfony doctrine-orm dql


    【解决方案1】:

    这个怎么样(编辑#2):

    $user = $this->createQueryBuilder('u')
            ->where('u.email = NULL')
            ->orWhere('u.email = \'\'')
            ->getQuery()->getResult()
    ;
    

    这行得通吗?

    【讨论】:

    • 抛出异常
    • 还有什么例外?
    • 错误:预期文字,得到 '"'
    • 抱歉,我忘了转义引号,而且我刚刚意识到您可以在 SQL 中使用 ",所以我将其设为单引号(就像您的回答一样)。
    • 似乎是对的。我没有在我编写的代码中显示它,但是我将 OR 子句放在 where 中的原因是因为在将 OR 和 AND 混合在不同的 where 子句中之前我遇到了问题。例如,如果您希望逻辑是:x AND (y OR z),您需要按照我的方式进行。但是对于我在这里问的情况,您的方法是正确的
    【解决方案2】:

    值得一提的是Expr Helper from QueryBuilder为此提供了一个功能:

    // Example - $qb->expr()->isNull('u.id') => u.id IS NULL
    public function isNull($x); // Returns string
    

    因此,对于您的情况,您可以执行以下操作:

    $qb = $this->createQueryBuilder('u');
    
    $qb
       ->where(
           $qb->expr()->orX(
               $qb->expr()->isNull('u.email'),
               $qb->expr()->eq('u.email', ':empty'),
           )
       )
       ->setParameter('empty', '""');
    
    $users = $qb->getQuery()->getResult();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 1970-01-01
      • 2017-07-13
      相关资源
      最近更新 更多