Comment exécuter une requête SQL brute avec Zend Framework 2
y a-t-il un moyen d'exécuter une chaîne SQL comme requête dans Zend Framework 2?
j'ai une chaîne comme ça:
$sql = "SELECT * FROM testTable WHERE myColumn = 5"
maintenant, je veux exécuter cette chaîne directement.
4 réponses
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. docu: Zend\Db→ Zend\Db\Sql
passez simplement la chaîne sql à votre adaptateur db comme ceci:
$resultSet = $adapter->query($sql, \Zend\Db\Adapter\Adapter::QUERY_MODE_EXECUTE);
Et si vous voulez passer des paramètres:
$sql = "SELECT * FROM testTable WHERE myColumn = ?";
$resultSet = $adapter->query($sql, array(5));
EDIT: veuillez noter que la méthode de requête ne renvoie pas toujours un jeu de résultats. Quand il s'agit d'un jeu de résultats produisant une requête (SELECT
), il renvoie un \Zend\Db\ResultSet\ResultSet
sinon(INSERT
,UPDATE
,DELETE
,...) il sera de retour une \Zend\Db\Adapter\Driver\ResultInterface
.
et quand vous laissez le second paramètre vide vous obtiendrez un \Zend\Db\Adapter\Driver\StatementInterface
lequel vous pouvez exécuter.
si vous utilisez tabllegateway, vous pouvez lancer votre requête SQL brute en utilisant cette instruction,
$this->tableGateway->getAdapter()->driver->getConnection()->execute($sql);
où $ sql se rapporte à votre requête brute. Cela peut être utile pour les requêtes qui n'ont pas d'équivalent natif ZF2 comme TRUNCATE / INSERT SELECT statements.
Si vous avez EntityManager
$em sur vos mains, vous pouvez faire quelque chose comme ceci:
$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
je pense que cette façon d'exécuter des requêtes complexes est la meilleure pour Zend. Mais peut-être que je ne suis pas très intelligent à Zend. Sera content de voir si cela aide quelqu'un.