Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony][Symfony2]Doctrine2, findBy i funkcja DATE()
Forum PHP.pl > Forum > PHP > Frameworki
Barton
Cześć,

Generuję takie zapytanie:

  1. SELECT
  2. t0.opis AS opis1,
  3. t0.start AS start2,
  4. t0.pomieszczenieid AS pomieszczenieid10
  5. FROM
  6. zlecenia t0
  7. WHERE
  8. t0.pomieszczenieid = 3 AND t0.start = '2025-12-30'
  9. ORDER BY
  10. t0.start ASC


w sposób następujący:

  1. $this->getDoctrine()->getRepository('MojWlasnyBundle:Zlecenia')->findBy(array('pomieszczenie'=>$pomieszczenie->getId(), 'start'=>$dataTime)


Problem w tym że pole start jest polem typu DateTime, a ja potrzebuję porównać tylko datę. W jaki sposób powyższe wywołanie mogę zmodyfikować żeby uzyskać coś takiego:

  1. SELECT
  2. t0.opis AS opis1,
  3. t0.start AS start2,
  4. t0.pomieszczenieid AS pomieszczenieid10
  5. FROM
  6. zlecenia t0
  7. WHERE
  8. t0.pomieszczenieid = 3 AND DATE(`start`) = '2025-12-30'
  9. ORDER BY
  10. t0.start ASC


Tzn jak przy polu start wykorzystać funkcję DATE bez korzystania z queryBuildera?
minolone
Sprawdź takie rozwiązanie
  1. $this->getDoctrine()->getRepository('MojWlasnyBundle:Zlecenia')->findBy(array('pomieszczenie'=>$pomieszczenie->getId(), 'start'=> new \DateTime($dataTime))
Crozin
1. Odwołując się do relacji nie musisz podawać ID, wystarczy sam obiekt. Wręcz powinieneś przekazywać sam obiekt.
2. Prawdopodobnie jedyne rozwiązanie to DQL:
  1. SELECT ... WHERE DATE(zleceie.start) = DATE(:start);
Barton
@minolone: źle mnie zrozumiałeś, $dataTime jest już obiektem typu DateTime. Ja pytam o to jak wywołać funkcję DATE() na poziomie SQLa. smile.gif

@Crozin:

  1. $query = $em->createQuery('SELECT t0.opis AS opis1, t0.start AS start2, t0.pomieszczenieid AS pomieszczenieid10 FROM MojWlasnyBundle:Zlecenia t0 WHERE t0.pomieszczenieid = :pomieszczenie AND DATE(`start`) = :start ORDER BY t0.start ASC');


i błąd:

Kod
[Syntax Error] line 0, col 163: Error: Expected known function, got 'DATE'


Czyżby brakowało jakiejś biblioteki?
Crozin
1. Mieszasz DQL z SQLem.
2. W Doctrine chyba rzeczywiście nie ma wbudowanej funkcji DATE (znanej z MySQLa). Prawdpodobnie ma to związek z polityką Doctrine by wbudowane funkcje działały dokładnie tak samo na wszystkich RDBMSach. Jednak nic nie stoi na przeszkodzie byś sam ją sobie utworzył: http://docs.doctrine-project.org/projects/...-functions.html
3. Jednak prawdopodobnie lepszym rozwiązaniem (zapewne też szybszym) będzie skorzystanie z BETWEEN:
  1. ...WHERE zlecenie.start BETWEEN :dateStart AND :dateEnd;
Gdzie dateStart i dateEnd to przykładowo: 13-04-2013 00:00:00 i 13-04-2013 23:59:59.
Barton
Skorzystałem z BETWEEN ... AND, dzięki. smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.