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:
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
Schauen Sie sich diesen Link http://norm.al/2012/07/20/zf2-sharing-db-connection/ – Weteef
@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