2013-06-21 32 views
9

Tôi muốn làm cho truy vấn này sử dụng Zend \ Db \ Sql \ Chọn:Zend Framework 2 Sql Chọn với OR và AND

SELECT table1.* FROM table1 
    INNER JOIN table2 ON table1.columnA = table2.columnB 
    INNER JOIN table3 ON table1.columnC = table3.columnD 

WHERE (table2.column2 = 2 or table3.column3 = 3) and table1.column1 = 1 

ORDER BY table1.columnE ASC LIMIT 1 

tôi có mã này cho đến nay:

/*@var $db Adapter */ 
$db = $this->getServiceLocator()->get('db'); 
$sql = new Sql($db); 
$select = $sql->select(); 

$select->from('table1'); 
$select->join('table2','table1.columnA = table2.columnB',array()); 
$select->join('table3','table1.columnC = table3.columnD',array()); 

$select->where(array('table2.column2' => 2, 'table2.column3' => 3), Predicate\PredicateSet::OP_OR); 

$select->where(array('table1.column1' => 1),Predicate\PredicateSet::OP_AND); 

$select->order('table1.columnE ASC'); 
$select->limit(1); 

$statement = $sql->prepareStatementForSqlObject($select); 
$resultSet = $statement->execute(); 

Nhưng doesn 't hoạt động, bởi vì sản xuất này (không có "(" và ")" cho OR):

SELECT table1.* FROM table1 
    INNER JOIN table2 ON table1.columnA = table2.columnB 
    INNER JOIN table3 ON table1.columnC = table3.columnD 

WHERE table2.column2 = 2 or table3.column3 = 3 and table1.column1 = 1 

ORDER BY table1.columnE ASC LIMIT 1 

Tôi có thể làm gì?

Trả lời

35

từ đỉnh đầu sử dụng ở đâu giao diện thông thạo:

$select->where 
     ->nest 
      ->equalTo('table2.column2', 2) 
      ->or 
      ->equalTo('table2.column3', 3) 
     ->unnest 
     ->and 
     ->equalTo('table1.column1', 1); 
+0

Cảm ơn, tôi đã sử dụng tạo "$ where = new \ Zend \ Db \ Sql \ Where();" nhưng điều này cũng hoạt động tốt. – leticia

+0

@ gsc-leticia rằng ví dụ sẽ ghi đè lên bất kỳ điều kiện nào đã được đặt trước, vì '$ select-> trong đó ($ where)' thay thế hoàn toàn đối tượng Where. Ngoài ra không cần thiết tạo ra các đối tượng thêm là một bit nhỏ nhất nhưng perf hit. – Xerkus

+0

cảm ơn, tôi sẽ kiểm tra và xác nhận bạn – leticia

7

tôi sẽ làm một cái gì đó như:

$where = new \Zend\Db\Sql\Where(); 

$where 
    ->nest() 
    ->equalTo('table2.column2', 2) 
    ->or 
    ->equalTo('table2.column3', 3) 
    ->unnest() 
    ->and 
    ->equalTo('table1.column1', 1); 
$select->where($where) 

Chỉ vì cách này $ bạn chọn giữ là một thực hiện Zend \ Db \ Sql \ SqlInterface khi đang thực hiện

$select->where 
    ->nest 

sẽ trả về một bản đồ e của một toán tử Zend Sql. Đó không phải là xấu nhưng sau đó bạn không thể chỉ làm

$statement = $sql->prepareStatementForSqlObject($select); 
$resultSet = $statement->execute(); 
+0

Cảm ơn, hoạt động tốt – leticia

+0

BTW bằng cách sử dụng giải pháp khác tôi có thể sử dụng: $ sql-> prepareStatementForSqlObject ($ select); và $ resultSet = $ statement-> execute(); không có vấn đề gì. – leticia

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