2017-04-21 5 views
0

downloadsというCakePHP 3アプリケーションにテーブルがあり、そのテーブルにmasterという名前のカラムがあります。CakePHP 3はヌル/空であればtinyint(1)フィールドを見つけることができません

$query = $this->Downloads->find()->where(['master' => true]); 

しかし、ケーキは私がdownloads.master !== 1ものを照会させません。フィールドタイプは私はこのようなdownloads.master == 1すべてのレコードを見つけることができますTINYINT(1)

に設定されています。クエリが実行されたときに、これらの作品はどれも、すべては空の配列/オブジェクトを返しません:

$query = $this->Downloads->find()->where(['master' => false]); 
$query = $this->Downloads->find()->where(['master' => 0]); 
$query = $this->Downloads->find()->where(['master' => null]); 
$query = $this->Downloads->find()->where(['master' => '']); 

は、あなたがこれを可能にする条件として何を使うのですか?私はphpMyAdminのを使用して、私のテーブル内のレコードを検討してきました...

私の思考はそれがtrueに反対だから、それはfalseでなければならないことだったが、CakePHPの3でほとんどの事と同じように、彼らは必要以上にそれがより複雑にしたいです実際には両方のレコードがあります。master == 1master == nullのようになりますので、返される結果はゼロです。

+0

を?それはエラーを投げているのですか?生成されたSQLをチェックしましたか? – drmonkeyninja

+2

最初はブール値をnullにすることはできません。 Boolは、真実か偽かの定義によって、それ以外は何も意味しません。それはあなたの問題を設計変更する必要はありません。何も変更する必要はありません。ヌル(「デフォルトなし」)以上が必要な場合は、代わりにtinyint(2)とENUMソリューションを使用してください。 – mark

答えて

4

NULLある列が0boolean -ishカラム型の場合にORMの観点から、すなわちfalse -ish)ことと同じではありません。 NULLと比較する場合は、IS NULLというクエリを発行する必要があります。これはCakePHPの要件ではなく、SQL/DBMSの要件です。

しかし、nullを渡すことは、コンテキストに応じてSQL NULLと比較したいということを必ずしも意味する必要はないので、あなたが何をしたいかを明示する必要があります。

かいつまんで、IS演算子を使用します。あなたは何を意味しています 'これらの作品のどれも' で

where(['master IS' => null]) 

も参照してください

関連する問題