2010-03-10 34 views
6

Tôi đang cố gắng tham gia vào 2 bảng trong Zend, sử dụng cấu trúc DbTable/model/mapper. Nếu trong mapper của tôi, tôi làm điều này:"IS NULL" trong Zend_Db_Table chọn không hoạt động

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

nó hoạt động như một nét duyên dáng, nhưng nếu tôi cố gắng điều tương tự với IS NULL thay vì NOT NULL, tôi nhận được gì nơi tôi sẽ nhận được một tập hợp kết quả của một số hàng, giống như khi tôi thử trực tiếp trong MySQL với

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

Tôi có ấn tượng Zend không giống như IS NULL của tôi hoặc tôi đang làm điều gì đó sai?

+2

Bạn đã thử Zend_Debug :: dump ($ select -> __ toString()); để xem sql nó tạo ra? Nếu bạn sao chép dán câu lệnh sql đó vào mysql, bạn có nhận được kết quả chính xác không? Nếu không, có gì khác với phiên bản được nhập theo cách thủ công? – PatrikAkerstrand

+0

Cảm ơn bạn! Làm như vậy tôi phát hiện ra rằng Zend đang tạo ra một tham gia bên trong thay vì tham gia bên trái tôi cần. Vì vậy, bằng cách sử dụng -> joinLeft() vấn đề của tôi đã được giải quyết. – Peter

Trả lời

13

Giải pháp là để được tìm thấy trong bình luận Machine về bài ban đầu của tôi. Làm những gì ông đề nghị tôi nhận thấy rằng Zend tạo một bên tham gia như tôi đã sử dụng phương pháp chọn sai, vì vậy:

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

là cách nó nên được.

+0

@Peter - bạn nên đánh dấu phần này là câu trả lời đúng :) – karim79

+0

@Karim, tôi không thể! Không phải trong 2 ngày. Stackoverflow chỉ cho phép chấp nhận câu trả lời của riêng bạn sau 2 ngày. :) – Peter

2

Suy nghĩ của tôi là nó phải làm theo cách MySql quyết định NULL là gì và không phải là gì. Có thể các kết quả bạn mong đợi có một chuyển nhượng mặc định của chuỗi trống '' hoặc 0 trong cột images.ref không? MySql không không phải coi chúng là NULL. Có một cái nhìn ở đây:

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

+0

Hey Karim, cảm ơn cho đầu vào, nhưng nó là NULL trong cột đó, không phải '' cũng không phải 0, tôi đã kiểm tra và chỉ cần kiểm tra lại. Hiện tại đang truy tìm bình luận của Machine, anh ta đang làm gì đó. – Peter

Các vấn đề liên quan