2013-06-21 42 views
9

我想要使用Zend \ DB \ SQL \選擇此查詢:Zend框架2 SQL和用或選擇與

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 

我到目前爲止這樣的代碼:

/*@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(); 

但沒有按不起作用,因爲產生這一個(沒有「(」和「)」的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 

我該怎麼辦?

回答

35

從頭頂使用Where流暢的界面:

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

謝謝,我用創建「$ where = new \ Zend \ Db \ Sql \ Where();」但是這工作得很好。 – leticia

+0

@ gsc-leticia該示例將覆蓋已存在的任何條件,如'$ select-> where($ where)'完全替換Where對象。另外不必要的創建額外的對象是最微小的一點,但是perf命中。 – Xerkus

+0

謝謝,我會檢查並確認你 – leticia

7

我會做這樣的事情:

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

正因爲這樣,你的$選擇繼續爲Zend的\ DB的實現\ SQL \ SqlInterface 而做

$select->where 
    ->nest 

將返回instanc e Zend Sql操作符。哪個不壞,但你不能只是做

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

謝謝,工作正常 – leticia

+0

BTW使用其他解決方案我可以使用:$ sql-> prepareStatementForSqlObject($ select);和$ resultSet = $ statement-> execute();沒有問題。 – leticia