2013-03-11 13 views

risposta

8
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

+1

Sto usando questo approccio per eseguire query complesse direttamente in un controller e funziona bene, ma il problema è che ho bisogno di dichiarare l'adattatore in ogni azione in cui ne ho bisogno, che è ridondante. Mi piacerebbe creare l'adattatore solo una volta e poi chiamarlo nelle azioni dove ne ho bisogno, ma non ho capito come farlo ... quindi la mia domanda è, come e dove dovresti dichiarare o creare il dbAdapter in un modo che in seguito puoi semplicemente chiamarlo in diverse azioni in un controller, senza doverlo dichiarare ogni volta che devi eseguire una query diversa? – Clarissa

+2

Guarda questo link http://norm.al/2012/07/20/zf2-sharing-db-connection/ – Weteef

+1

@Clarissa Non devi mai eseguire SQL in un controller. Si rompe il principio MVC. La comunicazione con il database è il lavoro del modello. – automatix

53

Basta passare la stringa sql per la scheda db in questo modo:

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

E se si desidera passare parametri:

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

EDIT: Si prega di notare che il metodo query non restituisce sempre un set di risultati. Quando è una query di produzione di risultati (SELECT) restituisce un \Zend\Db\ResultSet\ResultSet altrimenti (INSERT, UPDATE, DELETE, ...) restituirà un \Zend\Db\Adapter\Driver\ResultInterface.

E quando si lascia vuoto il secondo parametro, si otterrà un \Zend\Db\Adapter\Driver\StatementInterface che è possibile eseguire.

+1

Grazie per il collegamento! Era esattamente quello che stavo cercando. – Clarissa

4

Se si utilizza tableGateway, è possibile eseguire la query SQL prime con questa affermazione,

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

dove $ sql appartiene alla tua richiesta grezzo . Questo può essere utile per le query che non hanno controparte ZF2 nativa come le istruzioni TRUNCATE/INSERT SELECT.

-1

Se hai EntityManager $ em sulle mani, si può fare qualcosa di simile:

$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 

Credo che questo modo di eseguire query complesse è meglio per Zend. Ma forse non sono molto intelligente con Zend. Sarà lieto di vedere se aiuta qualcuno.