2013-03-11 4 views

Antwort

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. Doku: Zend\DbZend\Db\Sql

+1

Ich verwende diesen Ansatz, um einige komplexe Abfragen direkt in einem Controller auszuführen, und es funktioniert gut, aber das Problem ist, dass ich den Adapter in jeder Aktion deklarieren muss, wo ich es brauche, was redundant ist. Ich möchte den Adapter nur einmal erstellen und dann in den Aktionen aufrufen, wo ich es brauche, aber ich habe nicht herausgefunden, wie es geht ... also meine Frage ist, Wie und wo sollten Sie den dbAdapter deklarieren oder erstellen in einer Weise, dass Sie es später in verschiedenen Aktionen in einem Controller aufrufen können, ohne es jedes Mal deklarieren zu müssen, wenn Sie eine andere Abfrage ausführen müssen? – Clarissa

+2

Schauen Sie sich diesen Link http://norm.al/2012/07/20/zf2-sharing-db-connection/ – Weteef

+1

@Clarissa Sie sollten nie SQL in einem Controller ausführen. Es bricht das MVC-Prinzip. Die Kommunikation mit der Datenbank ist die Aufgabe des Modells. – automatix

53

Geben Sie einfach die SQL-Zeichenfolge zu Ihrem db-Adapter wie folgt aus:

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

Und wenn Sie Parameter wollen weitergeben müssen:

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

EDIT: Bitte beachten Sie, dass die Abfragemethode nicht immer zurückkehrt ein Ergebnissatz Wenn es eine Ergebnismenge ist, die eine Abfrage erzeugt (SELECT), gibt es eine \Zend\Db\ResultSet\ResultSet zurück, andernfalls (INSERT, UPDATE, DELETE, ...) wird eine \Zend\Db\Adapter\Driver\ResultInterface zurückgegeben. Wenn Sie den zweiten Parameter leer lassen, erhalten Sie eine \Zend\Db\Adapter\Driver\StatementInterface, die Sie ausführen können.

+1

Danke für diesen Link! Es war genau das, wonach ich suchte. – Clarissa

4

Wenn Sie tableGateway verwenden, können Sie Ihre RAW-SQL-Abfrage mit dieser Anweisung ausführen,

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

wo $ sql auf Ihre RAW-Abfrage bezieht . Dies kann für Abfragen nützlich sein, die keine nativen ZF2-Entsprechungen wie TRUNCATE/INSERT SELECT-Anweisungen haben.

$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 

Ich denke, auf diese Weise komplexe Abfragen ausführen ist am besten für Zend:

-1

Wenn Sie EntityManager $ em an den Händen haben, können Sie etwas tun. Aber vielleicht bin ich in Zend noch nicht sehr schlau. Ich bin froh zu sehen, ob es jemandem hilft.