Есть ли способ выполнить SQL String в качестве запроса в Zend Framework 2?
У меня есть строка вроде этого:
$sql = "SELECT * FROM testTable WHERE myColumn = 5"
теперь я хочу выполнить эту строку напрямую.
Есть ли способ выполнить SQL String в качестве запроса в Zend Framework 2?
У меня есть строка вроде этого:
$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. document: Zend\Db → Zend\Db\Sql
Просто передайте строку sql для вашего адаптера db следующим образом:
$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
,...) он вернет a \Zend\Db\Adapter\Driver\ResultInterface
.
И когда вы оставите второй параметр пустым, вы получите \Zend\Db\Adapter\Driver\StatementInterface
, который вы можете выполнить.
Если вы используете tableGateway, вы можете запустить свой необработанный SQL-запрос, используя этот оператор,
$this->tableGateway->getAdapter()->driver->getConnection()->execute($sql);
где $sql относится к вашему необработанному запросу. Это может быть полезно для запросов, у которых нет собственного сопоставления ZF2, такого как инструкции TRUNCATE/INSERT SELECT.
Если у вас есть 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. Рад видеть, помогает ли это кому-то.