web-dev-qa-db-fra.com

Comment exécuter une requête SQL brute avec Zend Framework 2

Existe-t-il un moyen d'exécuter une chaîne SQL en tant que 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.

17
nopaws
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\DbZend\Db\Sql

7
automatix

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. Lorsque c'est une requête produisant un jeu de résultats (SELECT), elle renvoie une \Zend\Db\ResultSet\ResultSet sinon (INSERT, UPDATE, DELETE, ...) il renverra un \Zend\Db\Adapter\Driver\ResultInterface.

Et lorsque vous laissez le deuxième paramètre vide, vous obtenez un \Zend\Db\Adapter\Driver\StatementInterface que vous pouvez exécuter.

54
Weteef

Si vous utilisez tableGateway, vous pouvez exécuter votre requête SQL brute à l'aide de 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 ZF2 natif comme les instructions TRUNCATE/INSERT SELECT.

4
user2897139

Si vous avez EntityManager $ em entre 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 toujours pas très intelligent à Zend. Ravi de voir si cela aide quelqu'un.

0
FlameStorm