Zend Framework 2 Db\Adapter\Adapter-Abfrage resultset wie ZF1
Brauchen nur eine hand, die das Verständnis einige einfache Datenbank-Abfragen in ZF2. In ZF1 habe ich einfache Methoden, wie diese:
public function recordset()
{
//listing of all records
$db = Zend_Registry::get('db');
$sql = "SELECT " . $this->_selectlist() .
" from customer c";
$r = $db->fetchAll($sql);
return $r;
}
In ZF2, wie würde ich das gleiche tun? Ich habe Folgendes versucht, aber dies nur gibt, was aussieht wie ein "Result" - Objekt, aber alles was ich will ist ein array wie ZF1 hat mit fetchAll. Wenn ich die Iteration der Ergebnis-Objekt nur den array später, die müssen dann iteriert man immer wieder, es scheint nur, wie einige überschneidungen.
Anyway, hier ist was ich habe in ZF2 so weit:
//above the controller start I have: use Zend\Db\Adapter\Adapter as DbAdapter;
public function blaAction()
{
$db = new DbAdapter(
array(
'driver' => 'Pdo',
'dsn' => 'mysql:dbname=mydb;host=localhost',
'username' => 'root',
'password' => '',
)
);
$sql = 'select * from customer';
$stmt = $db->query($sql);
$results = $stmt->execute();
$this->view->data = $results;
return $this->view;
}
In der Ausgabe bekomme ich dies:
object(Zend\Db\Adapter\Driver\Pdo\Result)#197 (8) {
["statementMode":protected]=> string(7) "forward" ["resource":protected]=> object(PDOStatement)#195 (1) {
["queryString"]=> string(22) "select * from customer"
} ["options":protected]=> NULL ["currentComplete":protected]=> bool(false) ["currentData":protected]=> NULL ["position":protected]=> int(-1) ["generatedValue":protected]=> string(1) "0" ["rowCount":protected]=> NULL
}
Jedoch, wenn ich $Ergebnisse zu $results->count();
ich sehe schon einen Datensatz. Wie bekomme ich die Daten zwar als ein array? (eine vollständige recordset)
Irgendwann sah ich etwas wie: $results->current()
Aber das nur wieder ein einzelner Datensatz.
Nur eine Randnotiz. Ich sehe alle Tabellen-abstrakte Klassen, die ich verwenden könnte, aber an diesem Punkt in meinem lernen, ich will nicht, das zu tun. Ich will nur einige einfache on-demand-Abfragen, Rückgabe-arrays, wie im ZF1. In ZF2, es scheint viel zu viel "Verdrahtung" der Dinge in configs und Sachen, die nur scheinen, wie overkill. Aber, wie ein Rahmen, ich mag die Flexibilität und die wichtigsten app-ich arbeite in ZF1 konnte wirklich profitieren von der Modularität der ZF2. (sonst würde ich wahrscheinlich gehen mit anderen Rahmen)
Bitte verzeihen Sie meine Unwissenheit, und danke sehr für jede Hilfe!!!
- Sieht aus wie es genau widerspiegelt native
PDO
haben Sie sich für eine Methode wiefetchAll
aufZend\Db\Adapter\Driver\Pdo\Result
? Andernfalls müssen Sie eine Schleife über die$result
wie würden Sie mit einem ausgeführt PDOStatement glaube ich. - Ja, ich sah die Doku: [link]framework.zend.com/apidoc/2.0/classes/..., Aber Ihr zeigt nur 1 Methode die Rückgabe ein array, das ist "current()". Und, die gibt nur einen einzigen Datensatz. Schade, es gibt keine ->toArray () - Methode oder ähnliches. Ich kann nicht glauben, dass es nicht möglich ist, ein recordset zurückgeben, in ZF2 obwohl, ohne den Gebrauch Ihrer Abstraktion-Klassen.
- Naja in der Regel auf dieser Ebene, die Sie nicht wollen, ein array... Sie möchten der aktuelle resultset wie mysqliresult resrouce, oder PDOStatement werden, weil Sie sich in einer Schleife durch. Nutzung von fetchAll ist in der Regel nicht eine gute Gewohnheit, wenn es ca seien Sie bequem in einigen Fällen. Sie können sich wahrscheinlich tun
$result->getResource()->fetchAll(PDO::FETCH_ASSOC)
zu umgehen. Obwohl insgesamt die id nicht empfehlen Zend_Db entweder in 2.x oder 1.x... Anstelle der id gehen Sie mit der Lehre - DBAL wenn Sie nur wollen, Abstraktion oder die komplette ORM-wenn Sie möchten, dass.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom http://framework.zend.com/manual/2.0/en/modules/zend.db.result-set.html:
So können Sie Folgendes tun:
Nun kannst du Sie zu der Ansicht:
Ok, ich denke ich habe es. Zumindest dies wird den job tun, für den Augenblick. Im Grunde müssen Sie eine zusätzliche Schritt-und Futtermittel das Ergebnis-Objekt in ein ResultSet-Objekt, das eine bequeme Methode toArray. Ich nehme an, dass dies getan werden könnte, eine Millionen andere Möglichkeiten, aber... das funktioniert.
Halten Sie im Verstand, ich würde das nicht in einem controller, oder sogar exakt in dieser Weise, aber das ist nur ein test an dieser Stelle. Es gibt Zeiten, wenn ich möchte, dass diese verfügbar sind, und dies ist, wie ZF2 kann es tun, wenn eine gewünschte. (egal welche guten/schlechten Gewohnheiten)
In der Spitze des Controllers hinzufügen/Einsatz der ResultSet:
Hier ist der working test-Aktion:
toArray ist gerade dabei eine foreach-Schleife für Sie, also, ich denke, es noch, hinzufügen von zusätzliche array-Schleifen wollte ich vermeiden, aber nicht angeschaut ZF1-version Ihres code, vielleicht tut ja eh der gleiche.
Was werde ich wohl tun ist, erstellen Sie eine einfache db-wrapper-Klasse für Zend\Db, die ersetzt meine Zend_Registry Aussage von ZF1 und fügt ein fetchAll und fetchOne Methode, so kann ich schnell Anschluss über eine Reihe von ZF1-code auf ZF2 viel einfacher.
Dank für euren input in den Kommentaren, die ich zu schätzen. 🙂
Oh, ich wollte auch zu erwähnen. Ich lief in dieser Brücke Klasse jemand erstellt, die könnte auch hilfreich sein:
https://github.com/fballiano/zfbridge
EDIT:
Also der adapter zurückgegebenen Ergebnisse sind iterierbar es stellt sich heraus. Ich bin nicht sicher, was Schritte, die ich nahm, führte dazu, meine Verwirrung, aber die Ergebnisse, die in $db->query zurückgegeben werden, wie ein Pdo\Ergebnis-Objekt und kann geloopt werden in foreach-einfach genug. Was hat mich aufgemischt, war die Tatsache, dass, wenn du var_dump es,es nicht in die array-Daten, nur das Objekt. Das führte mich auf einen völlig verwirrenden Weg.
Nun, auch wenn das oben funktioniert, das ist besser IMO, da können wir das Objekt, senden, wohin wir wollen für die iteration später. (eher als loop über die ganze Sache, um zuerst einen array erstellen, nur um eine weitere Schleife Durchlaufen, Verschwendung von Zeit, Weg)
Hier ist ein funktionierendes Beispiel, die ich lieber mag. Sie einfach Schleife das Objekt, und es sind Ihre Daten! duh! Nicht sicher, wie vermisse ich die einfachen Dinge manchmal. 🙂
Nach langer Suche habe ich Händel meine SQL-Abfrage in ZF2 so
Der trick ist die PHP-Funktion iterator_to_array
Können Sie vermeiden, die foreach-Schleife wie folgt:
Mein Englisch ist sehr faul
Ich habe auch diesem problem begegnet,$returnType Definiert in Zend\Db\ResultSet\ResultSet
wir geben Dritte argument für Zend\Db\Adapter\Adapter,wie dieser
nun,$N, ist array