6


2

Zend_Db_Tableの「IS NULL」選択が機能しない

DbTable / model / mapper構造を使用して、Zendの2つのテーブルで結合しようとしています。 私のマッパーでこれを行う場合:

$select = $this->getDbTable()->select(Zend_Db_Table::SELECT_WITH_FROM_PART)
        ->setIntegrityCheck(false)
        ->join('images', 'images.oldFilename =
                                               availablePictures.filename')
               ->where('images.ref IS NOT NULL');
$resultSet = $this->getDbTable()->fetchAll( $select );

それは魅力のように機能しますが、NOT NULLではなくIS NULLで同じことをしようとすると、MySQLで直接試したときのように、いくつかの行の結果セットを取得する場所が何も得られません

SELECT *
FROM (
`availablePictures` AS a
LEFT JOIN `images` AS i ON a.filename = i.oldFilename
)
WHERE i.`ref` IS NULL

ZendがIS NULLを好まないという印象を受けますか、何か間違ったことをしていますか?

2 Answer


13


解決策は、元の投稿に対するMachineのコメントに記載されていました。 彼が提案したことを実行すると、間違った選択方法を使用していたため、Zendが内部結合を作成したことに気付きました。

$select = $this->getDbTable()->select(Zend_Db_Table::SELECT_WITH_FROM_PART)
        ->setIntegrityCheck(false)
        ->joinLeft('images', 'images.oldFilename =
                                               availablePictures.filename')
               ->where('images.ref IS NOT NULL');
$resultSet = $this->getDbTable()->fetchAll( $select );

それがどうあるべきかです。


2


私の考えは、MySqlがNULLとそうでないものを決定する方法に関係していると考えています。 あなたが期待している結果には、空の文字列「 ''」または「0」が「images.ref」列にデフォルトで割り当てられている可能性がありますか? MySqlはこれらをNULLとして処理しません。 ここで見てみましょう: