2016-08-09 102 views
0

Ich möchte einen gespeicherten DateTime-Eintrag in meiner Datenbank mit dem aktuellen Datum mit Doctrine vergleichen.Symfony2: Vergleichen eines gespeicherten Datetime-Objekts mit dem aktuellen Datum mit Doktrin

Ich habe eine Liste der Schlüssel und ihre Beziehung zu einer Person. Mein Ziel ist es nun, eine Liste für verfügbare Schlüssel oder nicht verfügbare Schlüssel zu erstellen.

Dafür muss ich 2 Tabellen, Schlüssel und personToKey betrachten. Dabei hat personToKey ein Feld rueckgabe (Zeit, um den Schlüssel zurückzugeben) (dateTime) und einen Feldschlüssel (gespeicherte ID des Schlüssels) mit einer OneToMany Relation zur Feld-ID des Schlüssels Table.

Dank einer Suche hier, habe ich eine laufende SQL-Abfrage, die mir die Werte gibt, die ich suche. SQL Query:

SELECT * FROM key LEFT OUTER JOIN personToKey on key.id = personToKey.KeyId 
    WHERE personToKey.rueckgabe < NOW() 

Mein Problem ist jetzt, dass ich diese Lehre mit zu arbeiten, nicht bekommen. Ich hatte zwei Ansätze dafür.

$qb = $em->createQueryBuilder(); 
    $query = $qb->select('k') 
    ->from('MyBundle:key', 'k') 
    ->leftjoin('MyBundle:personToKey', 'ptk','WITH', 's.id = ptk.key') 
    ->where('ptk.rueckgabe < :date_now') 
    ->setParameter('date_now', date('Y-m-d H:i:m')) 
    ->getQuery(); 
    $test = $query->getResult(); 

Und

$sql = 'SELECT k FROM MyBundle:key k LEFT OUTER JOIN MyBundle:PersonToKey ptk WITH k.id = ptk.key WHERE (ptk.rueckgabe < CURRENT_DATE()) '; 
$query = $em->createQuery($sql); 
$test = $query->getResult(); 

Da die SQL-Abfrage funktioniert hätte ich gedacht, dass zumindest sollte der zweite Ansatz gearbeitet haben. Aber in beiden Fällen bekomme ich folgende Ergebnisse:

für ptk.rueckgabe> =: date_now die Liste ist in Ordnung, aber für ptk.rueckgabe <: date_now mich eine Mischung aus verfügbaren und nicht verfügbaren Tasten. Außerdem liegt die Länge des Ergebnisses unter der Anzahl der Zeilen, die die SQL-Abfrage in PHPMyAdmin findet.

Vielen Dank im Voraus.

Antwort

0

Ich habe endlich eine funktionierende Lösung für mein Problem gefunden, also wollte ich es teilen, wenn andere Leute ein ähnliches Problem haben.

$now = new \DateTime() ; 
    $now1=$now->format('Y-m-d H:i:s'); 
    $sql = 'SELECT * FROM key AS k 
    LEFT OUTER JOIN persontoKey AS ptk ON k.id = ptk.keyId 
    WHERE (ptk.rueckgabe < :now) '; 
    $em = $this->getDoctrine()->getManager(); 
    $stmt = $em->getConnection()->prepare($sql); 
    $stmt->bindValue('now', $now1, \PDO::PARAM_STR); 
    $stmt->execute(); 
    $helper= $stmt->fetchAll(); 
0

Als Antwort here heißt es:

Das Äquivalent von MySQL NOW() ist CURRENT_TIMESTAMP() Lehre DQL.

CURRENT_DATE() gibt nur den Datumsteil zurück.

Dies könnte erklären, warum der zweite Ansatz nicht das gleiche Ergebnis wie eine gerade SQL-Abfrage ergab.

Für den ersten Ansatz Sie folgende versuchen könnte, obwohl ich nicht sicher bin, ob es einen Unterschied machen:

->setParameter('date_now', new \DateTime()) 

Edit: ich ein anderes mögliches Problem in Ihrer Querybuilder gefunden: Statt von

->leftjoin('MyBundle:personToKey', 'ptk','WITH', 's.id = ptk.key') 

könnten Sie zu schreiben versuchen:

->leftjoin('k.personToKey', 'ptk') 

Die s .id war definitiv falsch, nicht sicher über den Rest.

+0

Ich versuchte es mit CURRENT_TIMESTAMP den zweiten Ansatz aus() und den ersten mit -> setParameter (‚date_now‘, neuer \ Datetime()), aber keiner von ihnen für mich gearbeitet. – coud28098

+0

Überprüfen Sie meine Bearbeitung .. Vielleicht hilft das? –

+0

Die sid war mein schlechtes, ich habe es in k.id. geändert. Ich änderte auch die Abfrage, aber immer noch das gleiche Ergebnis. – coud28098