Zend Framework 2でSQL文字列をクエリとして実行する方法はありますか?Zend Framework 2で生のSQLクエリを実行する方法
私はそのような文字列を持っている:
$sql = "SELECT * FROM testTable WHERE myColumn = 5"
は、今私が直接、この文字列を実行します。
Zend Framework 2でSQL文字列をクエリとして実行する方法はありますか?Zend Framework 2で生のSQLクエリを実行する方法
私はそのような文字列を持っている:
$sql = "SELECT * FROM testTable WHERE myColumn = 5"
は、今私が直接、この文字列を実行します。
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\Db → Zend\Db\Sql
ただ、このようなあなたの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\ResultSet
(INSERT
、UPDATE
、DELETE
、...)を返します。を返します。
2番目のパラメータを空のままにすると、実行できる\Zend\Db\Adapter\Driver\StatementInterface
が表示されます。
リンクありがとうございます!それはまさに私が探していたものでした。 – Clarissa
あなたがtableGatewayを使用している場合は、この文を使用して、生のSQLクエリを実行することができ、
$this->tableGateway->getAdapter()->driver->getConnection()->execute($sql);
。これは、TRUNCATE/INSERT SELECTステートメントのようなネイティブZF2対応のものを持たないクエリに役立ちます。あなたがあなたの手にEntityManager
$ EMをお持ちの場合
は、あなたがこのような何かを行うことができます。
$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のスマートではないかもしれません。それが誰かに役立つかどうかを見てうれしい。
私はこのアプローチを使用してコントローラで直接複雑なクエリを実行していますが、正常に動作しますが、必要なすべてのアクションでアダプタを宣言する必要があります。私はアダプタを一度しか作成しておらず、必要なところでアクションを呼びたいのですが、どうやってそれを行うのか分かりませんでした...私の質問は、どのように、どこで宣言するかdbAdapter後で別のクエリを実行する必要があるたびに宣言することなく、後でコントローラー内の別のアクションで呼び出すことができます。 – Clarissa
このリンクをご覧くださいhttp://norm.al/2012/07/20/zf2-sharing-db-connection/ – Weteef
@ClarissaコントローラでSQLを実行しないでください。それはMVCの値を破ります。データベースとの通信はモデルの仕事です。 – automatix