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.

16
demandé sur Code Lღver 2013-03-11 10:44:48

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

8
répondu automatix 2013-03-11 08:33:15

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.

53
répondu Weteef 2014-04-01 08:17:27

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.

4
répondu 2015-03-28 10:27:15

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.

0
répondu FlameStorm 2017-02-08 09:47:30