Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony][Symfony2]Doctrine2, findBy i funkcja DATE()
Barton
post
Post #1





Grupa: Zarejestrowani
Postów: 70
Pomógł: 2
Dołączył: 26.10.2008

Ostrzeżenie: (0%)
-----


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?

Ten post edytował Barton 13.04.2013, 16:29:54
Go to the top of the page
+Quote Post
minolone
post
Post #2





Grupa: Zarejestrowani
Postów: 141
Pomógł: 24
Dołączył: 21.06.2008

Ostrzeżenie: (0%)
-----


Sprawdź takie rozwiązanie
  1. $this->getDoctrine()->getRepository('MojWlasnyBundle:Zlecenia')->findBy(array('pomieszczenie'=>$pomieszczenie->getId(), 'start'=> new \DateTime($dataTime))


Ten post edytował minolone 13.04.2013, 18:22:29
Go to the top of the page
+Quote Post
Crozin
post
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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);
Go to the top of the page
+Quote Post
Barton
post
Post #4





Grupa: Zarejestrowani
Postów: 70
Pomógł: 2
Dołączył: 26.10.2008

Ostrzeżenie: (0%)
-----


@minolone: źle mnie zrozumiałeś, $dataTime jest już obiektem typu DateTime. Ja pytam o to jak wywołać funkcję DATE() na poziomie SQLa. (IMG:style_emoticons/default/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?
Go to the top of the page
+Quote Post
Crozin
post
Post #5





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Barton
post
Post #6





Grupa: Zarejestrowani
Postów: 70
Pomógł: 2
Dołączył: 26.10.2008

Ostrzeżenie: (0%)
-----


Skorzystałem z BETWEEN ... AND, dzięki. (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 20:10