【问题标题】:DQL How to return all records when parameter is emptyDQL如何在参数为空时返回所有记录
【发布时间】:2015-10-06 12:59:56
【问题描述】:

我正在构建一个 Symfony 应用程序,用户可以在其中通过包含许多字段的搜索表单进行一些搜索。现在我的 DQL 查询如下所示:

$users = $repository->createQueryBuilder('u')
      ->addSelect('u')
      ->from('AppBundle:User', 'b')
      ->where('u.Number = :Number **OR u.Number = :blank'**)
      ->andWhere('u.Code = :Code')
      ->setParameter('Number', $Number)
      ->setParameter('blank', $blank)
      ->setParameter('Code', $code)
      ->getQuery()
      ->getResult();

问题是当用户将某些字段留空时,我希望我的请求返回与条件相关的所有记录。现在没有返回记录,因为系统认为我想要具有特定“空白”条件的条目。我会很感激任何想法。谢谢

【问题讨论】:

    标签: symfony dql


    【解决方案1】:

    您可以在 DQL 中使用Expr class 来进一步构建围绕用户提交的“空白”字段的查询。简单的if(!empty($field)) 就能解决问题

    $query = $repository->createQueryBuilder('u')
      ->addSelect('u')
      ->from('AppBundle:User', 'b')
      ->where('u.Number = :Number')
      ->andWhere('u.Code = :Code')
      ->setParameter('Number', $Number)      
      ->setParameter('Code', $code);
    
    if(!empty($blank)){
      $query->andWhere($query->expr()->orX(
         $query->expr()->eq('u.Number', ':blank')
      ));
      $query->setParameter('blank', $blank);
    }
    
    $users = $query->getQuery()->getResult();
    

    【讨论】:

    • $blank 的值应该是多少?现在我将其设置为:$blank = "";,但它仍然认为我想要其中的空白条目并且什么都不返回((
    【解决方案2】:

    如果我理解正确,在这种情况下您实际上有 2 个参数,它们是:NumberCode。如果其中一个是“空白”,那么您设置了blank 变量?

    如果是这样的话,我认为你应该这样写你的请求:

    $query = $repository->createQueryBuilder('u')
            ->addSelect('u')
            ->from('AppBundle:User', 'b')
    
    if ($Number != "")
      $query->where('u.Number = :Number')
            ->setParameter('Number', $Number);
    
    if ($code != "") {
      if ($Number != "") $query->andWhere('u.Code = :Code');
      else $query->where('u.Code = :Code');
      $query->setParameter('Code', $code);
    }
    
    $users = $query->getQuery()->getResult();
    

    【讨论】:

    • 有效!!如果我没有现在的 2 个字段,但是,比如说,10 个搜索字段,我需要编写 10 个 if - else 块,甚至 10 * 10 个块,以便通过用户输入来证明每一种可能的情况,对吗?或者也许有任何解决方法可以解决这种情况?谢谢
    • 如果你有多个字段,你应该把then放在一个数组中,这样你就可以用foreach循环替换上面的行。
    • 好建议,谢谢。是否有可能看到这种实现的任何例子?恐怕我需要很长时间才能完成这个)))
    • 我手头没有例子。但是,如果您尝试了某事但它不起作用,请不要犹豫,提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 2012-08-26
    • 1970-01-01
    相关资源
    最近更新 更多