zend framework mysql zend-framework2

mysql - Cómo ejecutar la consulta SQL sin procesar con Zend Framework 2



zend mysql connection (4)

¿Hay alguna forma de ejecutar una cadena SQL como una consulta en Zend Framework 2?

Tengo una cuerda como esa:

$sql = "SELECT * FROM testTable WHERE myColumn = 5"

Ahora quiero ejecutar esta cadena directamente.


Si está utilizando tableGateway, puede ejecutar su consulta de SQL sin formato utilizando esta declaración,

$this->tableGateway->getAdapter()->driver->getConnection()->execute($sql);

donde $ sql pertenece a su consulta en bruto. Esto puede ser útil para las consultas que no tienen una contraparte ZF2 nativa como las sentencias TRUNCATE / INSERT SELECT.


Si tiene EntityManager $ em en sus manos, puede hacer algo como esto:

$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

Creo que esta forma de ejecutar consultas complejas es mejor para Zend. Pero puede ser que no soy muy inteligente en Zend todavía. Se alegrará de ver si ayuda a alguien.


Simplemente pase la cadena sql a su adaptador de db así:

$resultSet = $adapter->query($sql, /Zend/Db/Adapter/Adapter::QUERY_MODE_EXECUTE);

Y si quieres pasar parámetros:

$sql = "SELECT * FROM testTable WHERE myColumn = ?"; $resultSet = $adapter->query($sql, array(5));

EDITAR: tenga en cuenta que el método de consulta no siempre devuelve un conjunto de resultados. Cuando es un resultado que produce una consulta ( SELECT ), devuelve una /Zend/Db/ResultSet/ResultSet contrario ( INSERT , UPDATE , DELETE , ...) devolverá una /Zend/Db/Adapter/Driver/ResultInterface .

Y cuando deje el segundo Parámetro vacío, obtendrá un /Zend/Db/Adapter/Driver/StatementInterface que puede ejecutar.


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