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();
}
Sie verpassen eine enge Klammer – Li357
ich kann nicht herausfinden, was genau das Problem ist – eXtreme
ich habe Ihnen die Antwort.Es ist ein Syntaxfehler, weil Sie eine schließende Klammer fehlen – Li357