2016-09-13 4 views
0

Ich möchte den nächsten und vorherigen Datensatz in meiner Datenbank abrufen, dies ist mein erstes Mal mit DQL und ich verstehe nicht wirklich, warum es nicht funktioniert.Symfony DQL Syntaxfehler beim Auswählen des letzten und nächsten Datensatzes

Hier ist, wie meine benutzerdefinierte Abfrage wie folgt aussehen:

$em = $this->getDoctrine()->getManager(); 
    $rsm = new ResultSetMapping(); 
    $rsm->addScalarResult('id', 'id'); 

    $query = $em->createNativeQuery(
     'SELECT id 
     FROM SITEArticlesBundle:Article 
     WHERE 
      id = (SELECT id 
      FROM SITEArticlesBundle:Article 
      WHERE ? > 2 LIMIT 1) 
     OR 
      id = (SELECT id 
      FROM SITEArticlesBundle:Article 
      WHERE ? < 2 LIMIT 1)', $rsm); 
    $query->setParameter(1, $id); 
    $query->setParameter(2, $id); 
    $nextAndPrevNews = $query->execute(); 

Ich möchte Reihe von 2-ID erhalten, wie folgt aus:

[ 
    ['id' => 1] 
    ['id' => 3] 
] 

Aber ich habe eine SQL-Syntaxfehler

SQLSTATE [42000]: Syntaxfehler oder Zugriffsverletzung: 1064 Sie haben einen Fehler in Ihrer SQL-Syntax; Sie in die Bedienungsanleitung für die richtige Syntax zu Ihrer MySQL-Server-Version entspricht in der Nähe zu verwenden ‚: Artikel WHERE id = (id FROM SELECT‘ in Zeile 2

Ich wäre wirklich dankbar, wenn mir jemand helfen könnte

.

Dank

Antwort

1

Ein Problem ist der Doppelpunkt in dem Tabellennamen. das Zeichen ist nicht erlaubt, es sei denn, der Tabellenname entkommen ist.

ich, dass SITEArticlesBundle:Article isn vermuten ist der tatsächliche Bezeichner für die MySQL-Tabelle. In einer systemeigenen Abfrage müssen Sie den tatsächlichen Namen der MySQL-Tabelle angeben.

Wenn das Ihr Tabellenname ist, dann können Sie es in Graviszeichen Zeichen einschließen:

FROM `SITEArticlesBundle:Article` 

Ich bin nicht sicher, warum Sie mit einer wörtlichen 2 den Wert von $ id würden zu vergleichen, und nicht zu vergleichen das auf den Wert der id Spalte in der Tabelle. Ich verstehe es nicht.

Es sei denn, Sie versuchen, den Spaltennamen als Bindeparameter übergeben, was nicht funktioniert. Sie können Werte nur an eine vorbereitete SQL-Anweisung übergeben, Sie können Kennungen oder Schlüsselwörter oder andere SQL-Konstrukte nicht als Bindungsparameter übergeben.

Persönlich würde ich die OR-Bedingung und die Unterabfragen vermeiden und einfach eine UNION ALL-Operation verwenden.

SELECT MAX(p.id) AS id 
    FROM `SITEArticlesBundle:Article` p 
    WHERE p.id < ? 
    UNION ALL 
SELECT MIN(n.id) AS id 
    FROM `SITEArticlesBundle:Article` n 
    WHERE n.id > ? 
Verwandte Themen