• Jeder User im Forum verpflichtet sich zur Akzeptanz und zur Einhaltung dieser Regeln:
    1. Umgangston
      Ein angemessener höflicher Umgangston, ohne Beleidigungen, Beschimpfungen und aggressive Postings ist für jedes Mitglied Pflicht.
    2. Beiträge
      Jedes Mitglied sollte sich bemühen nur sinnvolle Beiträge zum Thema zu posten. Dabei ist unbedingt vorher zu prüfen, ob das Thema vorher schon einmal diskutiert wurde und daher fortgesetzt werden kann
      • Suchfunktion benutzen!
      • offizielle Doku lesen!
    3. Haftung
      Jeder Beitragsersteller übernimmt die alleinige Verantwortung seiner Inhalte.
    4. Werbung
      Wir erlauben keine Beiträge, Signaturen, Private Nachrichten oder eMails an Benutzer, die Werbung enthalten. Ausgenommen
      sind Stellengesuche /-angebote, welche ausschließlich im Forum "Stellengesuche" veröffentlicht werden dürfen.
    5. Verstöße
      Regelwidrige Beiträge sollten dem Team gemeldet werden. Nach deren Überprüfung werden wir schnellstmöglich
      entsprechend handeln.
    6. Authorität
      Den Anweisungen der Team-Mitglieder (Administratoren und Moderatoren) sind in diesem Forum Folge zu leisten.
      Bei Fragen oder Beschwerden bitte an diese wenden.
    Wir möchten Euch darauf aufmerksam machen, dass es bei Verstößen gegen einen oder mehreren der oben genannten
    Punkte dem Team frei steht entsprechend zu handeln. Dies kann z.B. das Löschen eines Beitrags, das Ausschliessen bzw.
    Sperren von Mitgliedern oder aber lediglich eine Verwarnung sein.

    In diesem Zusammenhang sollte erwähnt werden, dass das Forum automatisch die IP-Adresse jedes Beitrag-Erstellers
    speichert. Bei schweren Vergehen, behalten wir es uns vor, die IP-Adresse zur Strafverfolgung weiterzugeben.
  • Willkommen im Zend Framework Forum

    ZF1 Zend Framework 1 + ZF2 Zend Framework 2

    Das Zend Framework Forum ist seit 2006 die erste Anlaufstelle für Zend Framework Entwickler in Deutschland. Mit über 70.000 Beiträgen und einer steigenden Nutzerzahl bietet das Forum hilfreiche Themen und ZF-Tutorials für professionelle Entwickler, fortgeschrittene Programmierer sowie Zend Framework Einsteiger.
    Wenn dies Dein erster Besuch in der Zend Framework Community ist, lies bitte zuerst die Hilfe - FAQ durch. Du musst Dich registrieren, bevor Du Beiträge verfassen kannst. Klicke oben auf 'Registrieren', um die Registrierung zu starten. Du kannst auch jetzt schon Beiträge lesen. Hier im Forum findest Du die Zend Framework Hilfe, die Du suchst!

    Grüße an alle Zend Framework Entwickler. Das Team vom Zend Framework Forum!

    Drupal Agentur

JOIN mit mehreren ON-Klauseln

isac91

New member
Hallo Community,
ich arbeite derzeit daran, meine SQL's mittels Zend\Db\Sql abzubilden.
Bei einfachen Insert/Update/Delete-SQL's funktioniert das soweit auch tadellos.
Allerdings möchte ich nun eine Abfrage auf eine Satzartentabelle machen. Bei dieser Abfrage möchte ich 2 Informationen aus der selben Satzarten-Tabelle miteinander koppeln. (Der Aufbau der DB ist vorgegeben, daher bitte keine Diskussion das ihr die Tabellen evtl anders aufbauen würdet)

Das SQL, dass ich abbilden möchte, sieht folgendermaßen aus:
Code:
SELECT SUBSTR(a.info,0,24) as NAME, b.info as MAIL, a.key as NR
FROM SCHEMA.TBL a
LEFT OUTER JOIN SCHEMA.TBL b
ON a.KEY = b.KEY
AND a.ID = b.ID
AND b.ART='002'
WHERE a.AKTIV='1' AND a.ID='001' AND a.ART='100' 
ORDER BY a.INFO
Ich habe nun versucht dieses SQL mittels Zend\Db\Sql abzubilden:
PHP:
$select = new Select();
$select->from(array('a' => $this->tableGateway->getTable()));
$select->columns(array('NAME' => new Expression('SUBSTR(a.info, 0, 24)'),
    'NR' => 'KEY',
));
$on = "a.KEY = b.KEY AND a.ID = b.ID AND b.ART=002";
$select->join(array('b' => $this->tableGateway->getTable()), 
$on, array('MAIL' => 'info'), Select::JOIN_LEFT);
$where = new Where();
$where->equalTo('a.AKTIV', '1')
     ->and->equalTo('a.ID', '001')
     ->and->equalTo('a.ART','100')
$select->where($where);        
$select->order('a.INFO ASC');
echo $select->getSqlString($this->tableGateway->getAdapter()->getPlatform());
$results = $this->tableGateway->selectWith($select);
Als SQL kann ich mir dann an der stelle:
PHP:
echo $select->getSqlString($this->tableGateway->getAdapter()->getPlatform());
folgendes ausgeben lassen:
Code:
SELECT SUBSTR(a.info, 0, 24) AS "NAME", 
    "a"."KEY" AS "NR", 
    "b"."INFO" AS "MAIL" 
FROM "SCHEMA"."TBL" AS "a" 
LEFT JOIN "SCHEMA"."TBL" AS "b" 
ON "a"."KEY" = "b"."KEY" AND "a"."ID" = "b"."ID" AND "b"."ART"="002" 
WHERE "a"."AKTIV" = '1' 
    AND "a"."ID" = '001' 
    AND "a"."ART" = '100' 
ORDER BY "a"."INFO" ASC
was ja mal, bis auf die Anführungszeichen ziemlich richtig aussieht.
Als Fehlermeldung bekomme ich jedoch
Statement Prepare Failed

Kann mir jemand sagen, was ich falsch mache?
Danke
 

st0ffel

New member
Um welche Datenbank handelt es sich denn? Funktioniert die Query, wenn Du sie in der Konsole oder einem anderen Abfragetool ausführst?
 

isac91

New member
Es handelt sich um eine Db2-Datenbank.

Ich habe nun mal eine funktionierende Zend\Sql-Anweisung genommen und Schritt für Schritt auf das vorhandene Scenario umgebaut.
Das hat mir nun auch schon viel geholfen (Keine Ahnung, warum ich nicht gestern schon auf die Idee gekommen bin ^.^)
Zum einen ist die Db2-Datenbank case-sensitive. In meinem Beispiel hatte ich zwar alles groß geschrieben, in meiner Anwendung gabs aber ein Feld, welches ich versehentlich klein geschrieben habe.
Zum anderen musste ich bei den Expressions den Alias auch in Anführungszeichen setzen.
Also bspw. statt:
PHP:
new Expression('SUBSTR(a.INFO, 0, 24)')
eben
PHP:
new Expression('SUBSTR("a".INFO, 0, 24)')
Jetzt habe ich nur noch ein Problem in der On-Klausel.
Und zwar habe ich hier einen festen Wert drin.
PHP:
$on = "a.KEY = b.KEY AND a.ID = b.ID AND b.ART=002";
002 ist hierbei ein String.
Bei dieser on-Abfrage erzeugt er: ....
AND "b"."ART" = "002"
Und dann bekomme ich die Meldung das die Spalte "002" nicht gefunden wurde
Versuche ich:
PHP:
$on = "a.KEY = b.KEY AND a.ID = b.ID AND b.ART='002'";
erzeugt er:
AND "b"."ART" = "'""002"'""
was er dann auch nicht interpretieren kann.

Auch:
PHP:
$on = "a.KEY = b.KEY AND a.ID = b.ID AND b.ART=\'002\'";
bringt leider nichts.

Jemand eine Idee, wie ich die On-Abfrage richtig machen kann?
 

isac91

New member
So, ich komme der Sache immer näher.
Durch:
PHP:
$on = new Expression("b".ART = \'002\''); //Abgekürzt
bekomme ich nun ein SQL, welches sich zumindest auf der DB direkt ausführen lässt.

Das SQL wird auch allem Anschein nach in PHP ausgeführt.
Wenn ich dann aber mittels einer foreach-Schleife über das ResultSet gehen möchte, bekomme ich folgende Fehlermeldung:
This result is a forward only result set, calling rewind() after moving forward is not supported
EDIT:
Ok, der Fehler kommt erst, wenn ich ein zweites mal über das ResultSet mit foreach gehen möchte.
 
Zuletzt bearbeitet:

isac91

New member
Okay ;)
ENDLICH!!!
Die Lösung ist:
PHP:
//...
$results = $this->tableGateway->selectWith($select);
return $results->buffer();
Wenn ich es richtig verstehe, läd er sich durch buffer() die Daten in den Zwischenspeicher und ich kann so oft drüber laufen, wie ich möchte.
Wenn ich aber nur $results zurück gebe, ließt er die Werte nur einmal und wirft sie dann aus dem Zwischenspeicher, sodass ich kein zweites mal drüber laufen kann.
Verstehe ich das richtig? Kann mir das jemand bestätigen :-D

die Lösung gefunden habe ich hier php - This result is a forward only result set, calling rewind() after moving forward is not supported - Zend - Stack Overflow
 
Oben