2013-03-11 8 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.のドキュメンタリー:$ sqlをあなたの生のクエリに関連するZend\DbZend\Db\Sql

+1

私はこのアプローチを使用してコントローラで直接複雑なクエリを実行していますが、正常に動作しますが、必要なすべてのアクションでアダプタを宣言する必要があります。私はアダプタを一度しか作成しておらず、必要なところでアクションを呼びたいのですが、どうやってそれを行うのか分かりませんでした...私の質問は、どのように、どこで宣言するかdbAdapter後で別のクエリを実行する必要があるたびに宣言することなく、後でコントローラー内の別のアクションで呼び出すことができます。 – Clarissa

+2

このリンクをご覧くださいhttp://norm.al/2012/07/20/zf2-sharing-db-connection/ – Weteef

+1

@ClarissaコントローラでSQLを実行しないでください。それはMVCの値を破ります。データベースとの通信はモデルの仕事です。 – automatix

53

ただ、このようなあなたのDBアダプタにSQL文字列を渡す:

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

そして、あなたはパラメータを渡したい場合:

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

EDIT:クエリーメソッドは常に返しませんので、予めご了承くださいを結果セット。クエリの結果セット(SELECT)は、\Zend\Db\ResultSet\ResultSetINSERTUPDATEDELETE、...)を返します。​​を返します。

2番目のパラメータを空のままにすると、実行できる\Zend\Db\Adapter\Driver\StatementInterfaceが表示されます。

+1

リンクありがとうございます!それはまさに私が探していたものでした。 – Clarissa

4

あなたがtableGatewayを使用している場合は、この文を使用して、生のSQLクエリを実行することができ、

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

。これは、TRUNCATE/INSERT SELECTステートメントのようなネイティブZF2対応のものを持たないクエリに役立ちます。あなたがあなたの手にEntityManager $ EMをお持ちの場合

-1

は、あなたがこのような何かを行うことができます。

$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のスマートではないかもしれません。それが誰かに役立つかどうかを見てうれしい。

関連する問題