2016-06-02 13 views
0

Ich versuche, diese funktionierende MySQL-Abfrage in DQL-Abfrage zu konvertieren, aber ich habe ein Problem bei der Verwendung der CONCAT-Funktion (vielleicht) in DQL. Wie ich weiß, dass die Funktion CONCAT in DQL nur zwei Parameter annehmen kann, aber ich brauche drei Parameter und nach der Suche fand ich diese Lösung - VERSCHACHTELTE CONCAT:Konvertieren Abfrage einschließlich MySQL CONCAT-Funktion mit drei Parametern zu DQL-Abfrage (zwei Parameter)

MySQL-Abfrage benötigt, um DQL umgewandelt werden:

SET @new_booking_pickup_date = '2016-04-01'; 
SET @new_booking_pickup_time = '12:00:00'; 
SET @new_booking_return_date = '2016-05-01'; 
SET @new_booking_return_time = '13:00:00'; 

SELECT * FROM Reservation WHERE NOT ( 

CONCAT(@new_booking_pickup_date,' ',@new_booking_pickup_time) > CONCAT(return_date,' ',return_time) + INTERVAL 0 DAY 
OR 
CONCAT(@new_booking_return_date,' ',@new_booking_return_time) < CONCAT(pickup_date,' ',pickup_time) + INTERVAL 0 DAY 
); 

hier ist die DQL Lösung, was ich mit VERSCHACHTELTE CONCAT versucht:

return $this->getEntityManager() 
    ->createQuery(
     'SELECT id, licensePlate, 

     (SELECT car1.model FROM AppBundle:Car car1 WHERE car1.id = car.id) AS model_id, 
     (SELECT car2.brand FROM AppBundle:Car car2 WHERE car2.id = car.id) AS brand_id, 

     (SELECT carmodel.model FROM AppBundle:CarModel carmodel WHERE carmodel.id = model_id) AS model_name, 
     (SELECT carbrand.brand FROM AppBundle:CarBrand carbrand WHERE carbrand.id = brand_id) AS brand_name 

      FROM AppBundle:Car car WHERE IDENTITY(car.id) NOT IN (

      SELECT IDENTITY(reservation.car) FROM AppBundle:Reservation reservation WHERE NOT (

       CONCAT(CONCAT(:pickupDate, \' \'),:pickupTime) > CONCAT(CONCAT(reservation.returnDate, \' \'),reservation.returnTime) + INTERVAL 0 DAY 
      OR 
       CONCAT(CONCAT(:returnDate, \' \'),:returnTime) < CONCAT(CONCAT(reservation.pickupDate, \' \'),reservation.pickupTime) + INTERVAL 0 DAY 

      ) 


      )' 
    ) 
    ->setParameter('pickupDate', $pickupDate) 
    ->setParameter('returnDate', $returnDate) 
    ->setParameter('returnTime', $returnTime) 
    ->setParameter('pickupTime', $pickupTime) 
    ->getResult(); 

Hier ist das Ergebnis nach der Ausführung der DQL-Abfrage - Ausnahme !!!:

[Syntax Error] line 0, col 831: Error: Expected Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS, got '0' 

EDIT: Versucht diese DQL Abfrage ohne Erfolg durch Vorschlag von @Alvin Bunk:

return $this->getEntityManager() 
     ->createQuery(
      "SELECT car.id AS car_id, 

      (SELECT IDENTITY(car1.model) FROM AppBundle:Car car1 WHERE car1.id = car.id) AS model_id, 
      (SELECT IDENTITY(car2.brand) FROM AppBundle:Car car2 WHERE car2.id = car.id) AS brand_id, 

      (SELECT carmodel.model FROM AppBundle:CarModel carmodel WHERE carmodel.id = model_id) AS model_name, 
      (SELECT carbrand.brand FROM AppBundle:CarBrand carbrand WHERE carbrand.id = brand_id) AS brand_name 

       FROM AppBundle:Car car WHERE IDENTITY(car.id) NOT IN (

       SELECT IDENTITY(reservation.car) FROM AppBundle:Reservation reservation WHERE NOT (

        CONCAT(CONCAT(:pickupDate,' '),:pickupTime) > CONCAT(CONCAT(reservation.returnDate,' '),reservation.returnTime) + INTERVAL 0 DAY 
       OR 
        CONCAT(CONCAT(:returnDate,' '),:returnTime) < CONCAT(CONCAT(reservation.pickupDate,' '),reservation.pickupTime) + INTERVAL 0 DAY 

       ) 


       )" 
     ) 
     ->setParameter('pickupDate', $pickupDate) 
     ->setParameter('returnDate', $returnDate) 
     ->setParameter('returnTime', $returnTime) 
     ->setParameter('pickupTime', $pickupTime) 
     ->getResult(); 

Hier habe ich in doppelte Anführungszeichen um die Hauptabfrage und einfache Anführungszeichen bin mit CONCAT Funktion. Ich erhalte die gleiche Fehlermeldung:

[Syntax Error] line 0, col 849: Error: Expected Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS, got '0' 

EDIT: Ich fange das Problem zu denken, wird von der VERSCHACHTELTE CONCAT Funktion kommen, aber ich getestet es in der Konsole und es funktioniert perfekt - hier das Ergebnis ist:

php app/console doctrine:query:dql "SELECT CONCAT(CONCAT(car.licensePlate,' '),car.deposit) FROM AppBundle:Car car" 

array(4) { 
    [0]=> 
    array(1) { 
    [1]=> 
    string(10) "B0001HA 20" 
    } 
    [1]=> 
    array(1) { 
    [1]=> 
    string(10) "B0002HA 20" 
    } 
    [2]=> 
    array(1) { 
    [1]=> 
    string(10) "B0003HA 30" 
    } 
    [3]=> 
    array(1) { 
    [1]=> 
    string(10) "B0004HA 40" 
    } 
} 

die Lösung:

das Problem war in (+ INTERV AL 0 DAY) - es wird nicht von DQL unterstützt, in diesem Fall brauche ich es nicht einmal, da meine Felder bereits vom Typ DATE und TIME sind.

public function getCarsNotInRange($pickupDate, $pickupTime, $returnDate, $returnTime) 
    { 
     return $this->getEntityManager() 
      ->createQuery(
       " 
       SELECT car.id, car.licensePlate, 

       (SELECT IDENTITY(car1.model) FROM AppBundle:Car car1 WHERE car1.id = car.id) AS model_id, 
       (SELECT IDENTITY(car2.brand) FROM AppBundle:Car car2 WHERE car2.id = car.id) AS brand_id, 

       (SELECT carmodel.model FROM AppBundle:CarModel carmodel WHERE carmodel.id = model_id) AS model_name, 
       (SELECT carbrand.brand FROM AppBundle:CarBrand carbrand WHERE carbrand.id = brand_id) AS brand_name 

        FROM AppBundle:Car car WHERE car.id NOT IN 
        (
        SELECT IDENTITY(reservation.car) FROM AppBundle:Reservation reservation WHERE NOT 
         (
          CONCAT(CONCAT(:pickupDate, ' '),:pickupTime) > CONCAT(CONCAT(reservation.returnDate, ' '),reservation.returnTime) 
        OR 
          CONCAT(CONCAT(:returnDate, ' '),:returnTime) < CONCAT(CONCAT(reservation.pickupDate, ' '),reservation.pickupTime) 
        ) 
       ) 

     ") 
      ->setParameter('pickupDate', $pickupDate) 
      ->setParameter('returnDate', $returnDate) 
      ->setParameter('returnTime', $returnTime) 
      ->setParameter('pickupTime', $pickupTime) 
      ->getResult(); 
    } 
+0

Sie verpassen eine enge Klammer – Li357

+0

ich kann nicht herausfinden, was genau das Problem ist – eXtreme

+0

ich habe Ihnen die Antwort.Es ist ein Syntaxfehler, weil Sie eine schließende Klammer fehlen – Li357

Antwort

0

Die Lösung:

Das Problem war in (+ INTERVAL 0 DAY) - sie wird von DQL, ich brauche es nicht auch in diesem Fall nicht unterstützt werden, weil meine Felder bereits vom Typ Datum und Uhrzeit .

public function getCarsNotInRange($pickupDate, $pickupTime, $returnDate, $returnTime) 
    { 
     return $this->getEntityManager() 
      ->createQuery(
       " 
       SELECT car.id, car.licensePlate, 

       (SELECT IDENTITY(car1.model) FROM AppBundle:Car car1 WHERE car1.id = car.id) AS model_id, 
       (SELECT IDENTITY(car2.brand) FROM AppBundle:Car car2 WHERE car2.id = car.id) AS brand_id, 

       (SELECT carmodel.model FROM AppBundle:CarModel carmodel WHERE carmodel.id = model_id) AS model_name, 
       (SELECT carbrand.brand FROM AppBundle:CarBrand carbrand WHERE carbrand.id = brand_id) AS brand_name 

        FROM AppBundle:Car car WHERE car.id NOT IN 
        (
        SELECT IDENTITY(reservation.car) FROM AppBundle:Reservation reservation WHERE NOT 
         (
          CONCAT(CONCAT(:pickupDate, ' '),:pickupTime) > CONCAT(CONCAT(reservation.returnDate, ' '),reservation.returnTime) 
        OR 
          CONCAT(CONCAT(:returnDate, ' '),:returnTime) < CONCAT(CONCAT(reservation.pickupDate, ' '),reservation.pickupTime) 
        ) 
       ) 

     ") 
      ->setParameter('pickupDate', $pickupDate) 
      ->setParameter('returnDate', $returnDate) 
      ->setParameter('returnTime', $returnTime) 
      ->setParameter('pickupTime', $pickupTime) 
      ->getResult(); 
    } 
1

Verwenden Sie stattdessen doppelte Anführungszeichen um die Hauptabfrage. Ich denke, es sieht "\" als nächste Zeile und gibt diesen Fehler.

die unten aktualisiert:

return $this->getEntityManager() 
    ->createQuery(
     "SELECT id, licensePlate, 
     (SELECT car1.model FROM AppBundle:Car car1 WHERE car1.id = car.id) AS model_id, 
     (SELECT car2.brand FROM AppBundle:Car car2 WHERE car2.id = car.id) AS brand_id, 
     (SELECT carmodel.model FROM AppBundle:CarModel carmodel WHERE carmodel.id = model_id) AS model_name, 
     (SELECT carbrand.brand FROM AppBundle:CarBrand carbrand WHERE carbrand.id = brand_id) AS brand_name 
     FROM AppBundle:Car car 
      WHERE IDENTITY(car.id) NOT IN (
      SELECT IDENTITY(reservation.car) FROM AppBundle:Reservation reservation WHERE NOT (
       CONCAT(:pickupDate, \' \', :pickupTime) > CONCAT(reservation.returnDate, \' \', reservation.returnTime) + INTERVAL 0 DAY 
      OR 
       CONCAT(:returnDate, \' \',:returnTime) < CONCAT(reservation.pickupDate, \' \',reservation.pickupTime) + INTERVAL 0 DAY 
      ) 
      )" 
    ) 
    ->setParameter('pickupDate', $pickupDate) 
    ->setParameter('returnDate', $returnDate) 
    ->setParameter('returnTime', $returnTime) 
    ->setParameter('pickupTime', $pickupTime) 
    ->getResult(); 

es wieder versuchen!

+0

Ich habe die Frage aktualisiert - immer noch nicht funktioniert. Ich denke, das Problem kommt von der CONCAT-Funktion. Ich habe die CONCAT-Funktion in der Konsole mit Erfolg getestet, es ist richtig verkettet. – eXtreme

+0

Ich habe meinen Code aktualisiert und den internen Concat entfernt. Vielleicht ist das das Problem - probieren Sie es aus und sehen Sie, ob es funktioniert! –

+0

Funktioniert nicht mehr. So wenig wie ich weiß, die DQL CONCAT-Funktion hat nicht mit drei Parametern funktioniert, wird es nur zwei akzeptieren. Deshalb verwende ich verschachtelte CONCAT. Siehe meine Arbeitskonsolen-DQL-Abfrage mit NESTED CONCAT im EDIT. – eXtreme