2016-04-19 6 views
0

でNULL値を数えていない私は、このようなクエリがある:はDoctrineは比較

$thism = new \DateTime('first day of this month midnight'); 

    $parameters = array('thism' => $thism, 'user' => $user,'status'=>1); 

    return $this->createQueryBuilder('q') 
     ->select('count(q)') 
     ->where('q.createdAt > :thism') 
     ->andWhere('q.user = :user') 
     ->andWhere('q.completed != :status') 
     ->setParameters($parameters) 
     ->getQuery() 
     ->getSingleScalarResult(); 

これは、今月からすべての私の不完全なオブジェクトをカウントする必要があります。問題はq.completed != :statusです。これにより、completed=NULLのオブジェクトはカウントされません。で完成したブール値

class Quote 
{ 

    /** 
    * @var boolean 
    * 
    * @ORM\Column(name="completed", type="boolean", nullable=true) 
    */ 
    private $completed; 
} 

は私が何か間違ったことを行っている、またはなぜDoctrineはTRUEとは異なるものとしてNULLをカウントしませんか?

私は'status'=>11,true,TRUEに置き換えようとしましたが、引用符の有無にかかわらず、効果はありません。

フォーマット済みのクエリ:MySQLで

SELECT count(q0_.id) AS sclr_0 FROM quote q0_ WHERE q0_.created_at > ? AND q0_.user_id = ? AND q0_.completed <> ? 
Parameters: ['2016-04-01 00:00:00', '1', 1] 

SELECT count(q0_.id) AS sclr_0 FROM quote q0_ WHERE q0_.created_at > '2016-04-01 00:00:00' AND q0_.user_id = '1' AND q0_.completed <> 1; 
+0

生成されるSQLはどのように見えますか? (あなたはログでそれを見ることができます) – Miro

+0

@Miroは質問にそれを加えました。 –

答えて

1

Nullが真または偽のと同じではありません。

SELECT count(1) 
FROM <some table> 
WHERE completed != 1 
AND createdAt > '01042016 00:00' 
AND user = 'some_user' 

あなたはSQLであまりにもNULL値を照会したい場合は、次のようなクエリが必要です:

SELECT count(1) 
FROM <some table> 
WHERE 
    (completed != 1 or completed is NULL) 
AND createdAt > '01042016 00:00' 
AND user = 'some_user' 
をSQLへの変換であなたのクエリがされることを on MySQL official site.

に 詳細情報

デフォルトでこの列が必要な場合は、CREATE TABLEの文でdefault 0(または他の値)を使用してMySQLで定義できます。

CREATE TABLE my_table(
    ... 

    completed tinyint(1) default 0 
    .... 
) 

これを行うと、クエリは変更なしで動作するはずです。

+1

'MySQLのヌルは真偽と同じではありません。私が知らなかった奇妙なこと。これは、それに注意を払っていない場合、多くのクエリをねじ込むことができます。 –

+0

ヌル値を0として扱う必要がある場合は、デフォルトの – Tata

+0

を設定する必要がありますが、既存のヌル値の場合、値はスキーマ更新後もnullのままです。 –