2014-10-27 3 views
0

Я работаю с 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. Потому что тот, который я написал, просто дает мне userD.

Я знаю, что могу сделать это, чтобы получить всех пользователей, кроме пользователей, но это раздражает меня, чтобы написать две строки кода, чтобы спросить об этом. Есть ли более упрощенный способ?

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

Таким образом, любой успех? – fkupper

ответ

0

Вы должны использовать ИЛИ

'u.status <> 0 OR u.active <> 1' 
  • Дискретный выход для 'u.status <> 0 AND u.active <> 1' является верно для userD только beacuse как аргументы должны быть истинными при использовании И логический оператор.
  • Для userA u.status <> 0 не удается выполнить это условие.
  • Для userC u.active <> 1 не удается выполнить это условие.

Теперь, используя ИЛИ вы получите следующее:

  • Для ПользовательА: u.status <> 0 верно и u.active <> 1 ложно, один истинно, проходят
  • Для USERB : u.status <> 0 является ложным и u.active <> 1 является ложным, оба ложных, терпит неудачу
  • Для userC: u.status <> 0 верно и u.active <> 1 верно, как истинный, проходят
  • Для userD: u.status <> 0 ложно и u.active <> 1 верно, один истинно, проходят

Таким образом, все строки, но userB передает условие.

--------- EDIT -----------

Проверить это http://sqlfiddle.com/#!2/d3174/1/0

Смежные вопросы