和条件在学说

时间:2014-10-27 15:40:19

标签: sql doctrine-orm doctrine conditional-statements

我正在使用Doctrine 2,我想出了一些情况,我只想在少数类型的用户中进行一些查询。

  Type   Status  Active
 UserA   0       0
 UserB   0       1
 UserC   1       1
 UserD   1       0

我想做的所有查询都涉及用户A,用户C和用户D.下一个查询就是一个例子:

    public function countMonth(){
      $date = new \Datetime('now');
      $newDate = $date->format('Y-m');
      $this->qb = $this->em->createQueryBuilder();
      $this->qb->select('count(u) as cant')
         ->from('models\User', 'u')
         ->where('u.creation_date like ?1')
         ->andWhere('u.status <> 0 AND u.active <> 1'); //users B
      $this->qb->setParameter(1,"$newDate%");
      $query = $this->qb->getQuery();
      return $query->getSingleScalarResult();
    }   

我想知道如何执行一个查询,将所有用户抛回给用户B.因为我写的那个只是给了我用户D.

我知道我可以这样做以获得所有用户而不是用户B,但是有点让我感到恼火的是写两行代码来请求这个。有更简化的方法吗?

public function countMonth(){
    $orX = $this->qb->expr()->orX();
    $andX = $this->qb->expr()->andX();          
    $date = new \Datetime('now');
    $newDate = $date->format('Y-m');
    $this->qb = $this->em->createQueryBuilder();
    $this->qb->select('count(u) as cant')
        ->from('models\User', 'u');
    $andX->add('u.creation_date like ?1');
    $orX->add('u.status = 1 AND u.active = 1 OR u.active = 0'); 
    $orX->add('u.status = 0 AND u.active = 0');
    $andX->add($orX);
    $this->qb->add('where', $andX);
    $this->qb->setParameter(1,"$newDate%");
    $query = $this->qb->getQuery();
    return $query->getSingleScalarResult();
}   

1 个答案:

答案 0 :(得分:0)

你应该使用OR

'u.status <> 0 OR u.active <> 1'
  • {strong 1}的逻辑输出 true 仅限用户ID 因为使用 AND 逻辑运算符时,两个参数必须为true。
  • userA u.status&lt;&gt; 0没有达到这个条件。
  • userC u.active&lt;&gt; 1没有这个条件。

现在,使用 OR ,您将获得以下内容:

  • 对于 userA 'u.status <> 0 AND u.active <> 1'为真且u.status <> 0为false,一个为真,传递
  • userB u.active <> 1为false且u.status <> 0为false,均为,失败
  • userC u.active <> 1为真,u.status <> 0为真,为真,传递
  • userD u.active <> 1为false且u.status <> 0为真,一个为真,传递

这样,除了 userB 之外的所有行都会传递条件。

---------编辑-----------

查看http://sqlfiddle.com/#!2/d3174/1/0