"IS NULL" в Zend_Db_Table выберите не работает - PullRequest
6 голосов
/ 10 марта 2010

Я пытаюсь объединить 2 таблицы в Zend, используя структуру DbTable / model / mapper. Если в моем картографе я делаю это:

$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 );

это работает как шарм, но если я попробую то же самое с IS NULL вместо NOT NULL, я ничего не получу там, где должен получить результирующий набор из нескольких строк, точно так же, как когда я пробую это непосредственно в MySQL с

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

У меня сложилось впечатление, что Зенду не нравится, когда я IS NULL или я что-то не так делаю?

Ответы [ 2 ]

13 голосов
/ 10 марта 2010

Решение было найдено в комментарии машины к моему оригинальному сообщению. Делая то, что он предложил, я заметил, что Zend создал внутреннее объединение, поскольку я использовал неправильный метод select, поэтому:

$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 голосов
/ 10 марта 2010

Я думаю, что это связано с тем, как MySql решает, что NULL, а что нет. Возможно ли, что ожидаемые результаты будут иметь значение по умолчанию для пустой строки '' или 0 в столбце images.ref? MySql не обрабатывает их как NULL. Посмотрите здесь:

http://dev.mysql.com/doc/refman/4.1/en/working-with-null.html

...