有沒有一種方法可以在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.實況:Zend\Db → Zend\Db\Sql
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
您可以執行。
感謝您的鏈接!這正是我所期待的。 – Clarissa 2013-03-19 07:54:14
如果您正在使用tableGateway,您可以運行使用此語句您的原始SQL查詢,
$this->tableGateway->getAdapter()->driver->getConnection()->execute($sql);
其中$ SQL涉及到你的原始查詢。對於沒有像TRUNCATE/INSERT SELECT語句那樣的本機ZF2對應的查詢,這可能很有用。
如果你有你的手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還不是很聰明。很高興看到它是否有助於某人。
我正在使用這種方法直接在控制器中執行一些複雜的查詢,並且工作正常,但問題是我需要在每個需要它的操作中聲明適配器,這是多餘的。我只想創建一次適配器,然後在需要它的操作中調用它,但是我沒有想到如何去做它......所以我的問題是,如何以及在哪裏聲明或創建dbAdapter在稍後的方式中,您可以在控制器的不同操作中調用它,而不必在每次需要執行不同的查詢時都聲明它。 – Clarissa 2013-03-18 13:53:10
看看這個鏈接http://norm.al/2012/07/20/zf2-sharing-db-connection/ – Weteef 2013-03-18 18:10:14
@Clarissa你不應該在控制器中執行SQL。它打破了MVC的原則。與數據庫的交流是模型的工作。 – automatix 2013-03-18 19:21:13