我正在使用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();
}
答案 0 :(得分:0)
你应该使用OR
'u.status <> 0 OR u.active <> 1'
现在,使用 OR ,您将获得以下内容:
'u.status <> 0 AND u.active <> 1'
为真且u.status <> 0
为false,一个为真,传递u.active <> 1
为false且u.status <> 0
为false,均为,失败u.active <> 1
为真,u.status <> 0
为真,为真,传递u.active <> 1
为false且u.status <> 0
为真,一个为真,传递这样,除了 userB 之外的所有行都会传递条件。
---------编辑-----------