2014-10-27 88 views
0

我正在與Doctrine 2,我想出了這種情況,我只想在幾種類型的用戶之間做一些查詢。AND條件在學說

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

因此,任何的成功嗎? – fkupper 2014-11-04 17:23:04

回答

0

你應該使用或

'u.status <> 0 OR u.active <> 1' 
  • 邏輯輸出'u.status <> 0 AND u.active <> 1'userD僅怎麼一回事,因爲這兩個參數使用邏輯運算符時,必須是真實的。
  • 對於userA u.status <> 0不符合此條件。
  • 對於userC u.active <> 1不符合此條件。

現在,使用你會得到如下:

  • 對於用戶Au.status <> 0是真實的,u.active <> 1是假的,一個是真的,通過
  • 對於用戶Bu.status <> 0爲假,u.active <> 1爲假,均爲假,失敗
  • 對於用戶Cu.status <> 0是真實和u.active <> 1爲真,都爲真,通過
  • 對於userDu.status <> 0爲假且u.active <> 1爲真,之一爲真,通過

這樣,除用戶B以外的所有行均通過該條件。

--------- -----------編輯

檢查了這一點http://sqlfiddle.com/#!2/d3174/1/0