Doctrine2 INTERVAL v querybuilderu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
lukyrys
Člen | 36
+
0
-

Zdravim, resil nekdo jak pouzit korektne v Doctrine2 INTERVAL? Existuje extension?
Mam v queryBuilderu nasledujici

$result = $this->em
    ->getRepository(Parkings::class)
    ->createQueryBuilder('p')
    ->select('space.id')
    ->join(ParkingSpaces::class, 'space', 'WITH', 'p.id = space.parkings')
    ->leftJoin(Reservations::class, 'reservation', 'WITH', 'space.id = reservation.parkingSpaces')
    ->groupBy('space.id')
    ->where('p.id = :parkingId')
    ->andWhere(':from BETWEEN DATE_ADD(reservation.start, INTERVAL -15 minute) AND DATE_ADD(reservation.end, INTERVAL +15 minute)')
    ->orWhere(':to BETWEEN DATE_ADD(reservation.start, INTERVAL -15 minute) AND DATE_ADD(reservation.end, INTERVAL +15 minute)')
    ->setParameter('parkingId', 15)
    ->setParameter('from', '2017-04-20 02:21:02')
    ->setParameter('to', '2017-04-20 03:30:00')
    ->getQuery()
    ->getResult();

bohuzel na me rve [Syntax Error] line 0, col 299: Error: Expected Doctrine\ORM\Query\Lexer::T_COMMA, got ‚-‘

Editoval lukyrys (20. 4. 2017 1:26)

Svaťa Šimara
Člen | 98
+
0
-

Trochu jsem pohledal v dokumentaci, a DATE_ADD příjmá v Doctrine 3 parametry http://docs.doctrine-project.org/…anguage.html#… DATE_ADD(date, days, unit)

Dokumentace sice tvrdí, že unit může být pouze DAY nebo MONTH, ale implementace říká, že už mají i sekundy a minuty https://github.com/…Platform.php#L80

Zkus tedy

->andWhere(":from BETWEEN DATE_ADD(reservation.start, -15, 'MINUTE')...")

Anebo přímo funkci DATE_SUB

lukyrys
Člen | 36
+
0
-

Svaťa Šimara napsal(a):

Trochu jsem pohledal v dokumentaci, a DATE_ADD příjmá v Doctrine 3 parametry http://docs.doctrine-project.org/…anguage.html#… DATE_ADD(date, days, unit)

Dokumentace sice tvrdí, že unit může být pouze DAY nebo MONTH, ale implementace říká, že už mají i sekundy a minuty https://github.com/…Platform.php#L80

Zkus tedy

->andWhere(":from BETWEEN DATE_ADD(reservation.start, -15, 'MINUTE')...")

Anebo přímo funkci DATE_SUB

Diky za nakopnuti, minuty to nebere ani tak musel sem pouzit sekundy a jeste ouvozovkovat jinak se mu nelibil – literal

->andWhere(':from BETWEEN DATE_ADD(reservation.start, \'-900\', \'SECOND\') AND DATE_ADD(reservation.end, \'+900\', \'SECOND\')')
            ->orWhere(':to BETWEEN DATE_ADD(reservation.start, \'-900\', \'SECOND\') AND DATE_ADD(reservation.end, \'+900\', \'SECOND\')')
Svaťa Šimara
Člen | 98
+
+1
-

@lukyrys Aby ses zbavil těch uvozovek, ještě můžeš zkusit proměnné

->andWhere(':from BETWEEN DATE_ADD(reservation.start, :delta, \'SECOND\'...')
->setParameter('delta', 900)

Ale fakt nevím, jestli to pomůže