3 Stimmen

doctrine select-Anweisung gibt immer alle Felder der Tabelle zurück

Ich habe die folgende Tabelle

Test:
    tableName: test
    columns:
        test_id:
            name: test_id as id
            primary: true
            autoincrement: true
            type: integer
            notnull: true
        test_name:
            name: test_name as name
            type: string(255)
        test_title:
            name: test_title as title
            type: string(255)

und diese dql-Anweisung

$dql = Doctrine_Query::create()->select('t.name')->from('Model_Test t');

wird die folgende Sql generiert

SELECT t.test_id AS t__test_id, t.test_name AS t__test_name FROM test t

aber nach dem Abrufen des Ergebnisses in doctrine habe ich Zugriff auf das Titelfeld, auch wenn es nicht ausgewählt ist:

foreach ($results as $result) {
    foreach ($result as $filed => $value) {
        echo "$filed => $value <hr>"; // echoes 'title' => null but title in db has other value
    }                                
}                                

auch ein Dump über Zend_Debug::dump($results->toArray()); zeigt mir alle Felder, als ob ich ein select * gemacht hätte

Wie kann ich also die zurückgegebenen Felder auf meine Auswahl beschränken?

Vielen Dank im Voraus

Martin

0 Stimmen

Haben Sie jemals die Lösung für dieses Problem gefunden? Ich habe auch damit zu kämpfen. Ich möchte nicht unnötigen Müll als json für Ajax Verbraucher übergeben.

0 Stimmen

Vergessen Sie's, ->setHydrationMode(Doctrine::HYDRATE_ARRAY) hat das Problem gelöst.

3voto

Martin Punkte 61

Ich denke schon:

denn

$results = $dql->execute();

holt das Ergebnis als Objekt ab, die nicht ausgewählten Variablen werden mit Nullen gefüllt

während

$results = $dql->fetchArray(); 

holt ein Array und in diesem Fall erscheinen nur die ausgewählten Felder (außer dem Primärschlüssel)

1voto

Attila Fulop Punkte 6451

Diese funktioniert bei mir und holt nur die abgefragten Felder ab:

$events = Doctrine_Query::create()
     ->select("e.id, e.Title, e.Lat, e.Lon, e.Startdate, e.Location, e.Url")
     ->from('Event e')
     ->setHydrationMode(Doctrine::HYDRATE_ARRAY)
     ->execute();

Das resultierende Array wird nur die ausgewählten Felder enthalten

0voto

petraszd Punkte 4099

Ich bin mir nicht sicher, aber ich glaube, die Lehre wählt nur id y name , aber wenn Sie versuchen, auf title er sieht, dass title wird nicht aus der DB geholt. Also holt die Lehre dieses Objekt erneut (nur dieses Mal mit SELECT * oder eine ähnliche Abfrage).

Wenn Sie eine Art von Doctrine Query Profiler haben - Sie könnten wahrscheinlich alle zusätzlichen Abfragen in foreach-Schleife erforderlich sehen.

Übrigens nur eine wilde Vermutung...

Oh, Sie können die $query->execute(Doctrine::HYDRATE_ARRAY) wenn Sie nur einen Teil der Felder auswählen möchten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X