2011-05-28 14 views
14

¿Hay alguna forma de ejecutar SQL String como una consulta en Zend Framework?Consulta RAW SQL con Zend Framework

que tienen una cadena como esa:

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

ahora quiero para ejecutar esta serie directamente withput analizarlo y la creación de un objeto Zend_Db_Table_Select de ella "a mano". O si es posible crear un objeto Zend_Db_Table_Select a partir de esta cadena, para ejecutar ese objeto.

¿Cómo puedo hacer eso? No encontré una solución para esto en el documento Zend.

Respuesta

22

Si está creando un objeto Zend_DB al comienzo, puede crear una consulta utilizando eso. Echar un vistazo a esta entrada en el manual: http://framework.zend.com/manual/en/zend.db.statement.html

$stmt = $db->query(
      'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?', 
      array('goofy', 'FIXED') 
     ); 

O

$sql = 'SELECT * FROM bugs WHERE reported_by = ? AND bug_status = ?'; 
$stmt = new Zend_Db_Statement_Mysqli($db, $sql); 
+1

hace '$ db-> query ($ sql, array())' trabajo también? porque tengo los parámetros ya codificados en la cadena? ¿Y debo buscar el resultSet con '$ stmt-> fetchAll()'? –

+0

¡Gracias funcionó como un encanto! –

+0

En aras de la exhaustividad: sí, $ stmt-> fetchAll() obtendrá los resultados. –

2

Usted puede utilizar la misma consulta en formato Zend como

$select = db->select()->from(array('t' => 'testTable')) 
        ->$where= $this->getAdapter()->quoteInto('myColumn = ?', $s); 
$stmt = $select->query(); 
$result = $stmt->fetchAll(); 
+0

No necesita usar quoteInto() aquí. donde() lo hará por usted automáticamente. – txyoji

2

Si está utilizando tableGateway, se puede ejecutar su consulta SQL sin procesar usando esta instrucción,

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

donde $ sql pertenece a su consulta sin formato. Esto puede ser útil para consultas que no tienen homólogo ZF2 nativo como TRUNCATE/INSERT SELECT.

1

Aquí es un ejemplo para ZF1:

$db =Zend_Db_Table_Abstract::getDefaultAdapter(); 
$sql = "select * from user" 
$stmt = $db->query($sql); 
$users = $stmt->fetchAll(); 
+0

para mí no funciona, ¿por qué tengo que definir $ db variable mención arriba, en mi clase que se extiende desde Zend_Db_Table_Abstract o en mi controlador? – adm

+0

@adm puede usar ** $ db = Zend_Db_Table_Abstract :: getDefaultAdapter(); ** anywhrere. El código anterior es de mi controlador. –

+0

Me da un error como este: Error fatal: Llamar a una consulta de función de miembro() en un objeto no en /home/tmtmedia/public_html/trakmysafari/application/models/trip.php en la línea 199 –