2013-03-11 63 views

回答

8
use Zend\Db\Sql\Sql; 
use Zend\Db\Adapter\Adapter; 

$dbAdapterConfig = array(
    'driver' => 'Mysqli', 
    'database' => 'dbname', 
    'username' => 'dbusername', 
    'password' => 'dbuserpassword' 
); 
$dbAdapter = new Adapter($dbAdapterConfig); 

$sql = new Sql($dbAdapter); 
$select = $sql->select(); 
$select->from('testTable'); 
$select->where(array('myColumn' => 5)); 

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

S.實況:Zend\DbZend\Db\Sql

+1

我正在使用這種方法直接在控制器中執行一些複雜的查詢,並且工作正常,但問題是我需要在每個需要它的操作中聲明適配器,這是多餘的。我只想創建一次適配器,然後在需要它的操作中調用它,但是我沒有想到如何去做它......所以我的問題是,如何以及在哪裏聲明或創建dbAdapter在稍後的方式中,您可以在控制器的不同操作中調用它,而不必在每次需要執行不同的查詢時都聲明它。 – Clarissa 2013-03-18 13:53:10

+2

看看這個鏈接http://norm.al/2012/07/20/zf2-sharing-db-connection/ – Weteef 2013-03-18 18:10:14

+1

@Clarissa你不應該在控制器中執行SQL。它打破了MVC的原則。與數據庫的交流是模型的工作。 – automatix 2013-03-18 19:21:13

53

SQL字符串只是傳遞給你的數據庫適配器這樣的:

$resultSet = $adapter->query($sql, \Zend\Db\Adapter\Adapter::QUERY_MODE_EXECUTE); 

如果你想傳遞參數:

$sql = "SELECT * FROM testTable WHERE myColumn = ?"; 
$resultSet = $adapter->query($sql, array(5)); 

編輯:請注意查詢方法並不總是回報結果集。當其結果集生成查詢(SELECT)時,它將返回\Zend\Db\ResultSet\ResultSet,否則(INSERT,UPDATE,DELETE,...)將返回​​。

而當您將第二個參數留空時,您將得到\Zend\Db\Adapter\Driver\StatementInterface您可以執行。

+1

感謝您的鏈接!這正是我所期待的。 – Clarissa 2013-03-19 07:54:14

4

如果您正在使用tableGateway,您可以運行使用此語句您的原始SQL查詢,

$this->tableGateway->getAdapter()->driver->getConnection()->execute($sql); 

其中$ SQL涉及到你的原始查詢。對於沒有像TRUNCATE/INSERT SELECT語句那樣的本機ZF2對應的查詢,這可能很有用。

-1

如果你有你的手EntityManager $他們,你可以做這樣的事情:

$select = $em->getConnection()->executeQuery(" 
     SELECT a.id, a.title, a.announcement, asvc.service_id, COUNT(*) AS cnt, 
      GROUP_CONCAT(asvc.service_id SEPARATOR \", \") AS svc_ids 
     FROM article AS a 
     JOIN articles_services AS asvc ON asvc.article_id = a.id 
     WHERE 
     asvc.service_id IN (
      SELECT tsvc.service_id 
      FROM tender AS t 
      JOIN tenders_services AS tsvc ON tsvc.tender_id = t.id 
      WHERE t.id = :tenderId 
     ) 
     GROUP BY a.id 
     ORDER BY cnt DESC, a.id DESC 
     LIMIT :articlesCount 
    ", [ 
     'articlesCount' => 5, 
     'tenderId' => $tenderId, 
    ], [ 
     'articlesCount' => \PDO::PARAM_INT, 
    ]); 

    $result = $select->fetchAll(); // <-- here are array of wanted rows 

我覺得這種方式來執行復雜的查詢是最適合的Zend。但可能是我在Zend還不是很聰明。很高興看到它是否有助於某人。