2011-08-12 10 views
13

Cześć Mam DQL który działa (mam całe zdarzenie od początku):Doktryna DQL Data jako problemu parametru

DoctrineHelper::getEntityManager()->createQueryBuilder() 
    ->select("u.surname, count(u.surname) as total") 
    ->from("User", "u") 
    ->from("AbstractEvent", "e") 
    ->from("Attendance", "a") 
    ->where("u = a.attendee") 
    ->andWhere("e = a.event") 
    ->andWhere("a.status=1") 
    ->andWhere("e.date<CURRENT_TIMESTAMP()") 
    ->groupBy("u.email") 
    ->orderBy("total","desc"); 

Ale to nie (Chciałbym tylko tym miesiącu zdarzenie) :

DoctrineHelper::getEntityManager()->createQueryBuilder() 
    ->select("u.surname, count(u.surname) as total") 
    ->from("User", "u") 
    ->from("AbstractEvent", "e") 
    ->from("Attendance", "a") 
    ->where("u = a.attendee") 
    ->andWhere("e = a.event") 
    ->andWhere("a.status=1") 
    ->andWhere("e.date<CURRENT_TIMESTAMP()") 
    ->andWhere("e.date>?", date('Y-m-d 00:00:00', strtotime('-'.(date('j')-1).' day'))) 
    ->groupBy("u.email") 
    ->orderBy("total","desc"); 

Moja error.log ma ten wiersz:

#0 /var/www/Doctrine/ORM/Query/AST/InputParameter.php(46): Doctrine\\ORM\\Query\\QueryException::invalidParameterFormat('?') 

print_r na dzień daje mi: 2011-08-01 00:00:00 co jest corr ect.

Oto mapowania dla terminu:

/** 
    * Date of the event. 
    * @Column(type="datetime") 
    */ 
    private $date; 

Każda pomoc mile widziane dzięki!

Odpowiedz

6

Couldn'y że praca z parametrem więc o to, co w końcu doszedłem do:

$now = new DateTime; 
$now->modify('-'.(date('j')-1).' day'); 

$qb = DoctrineHelper::getEntityManager()->createQueryBuilder() 
         ->select("u.surname, count(u.surname) as total") 
         ->from("User", "u") 
         ->from("AbstractEvent", "e") 
         ->from("Attendance", "a") 
         ->where("u = a.attendee") 
         ->andWhere("e = a.event") 
         ->andWhere("a.status=1") 
         ->andWhere("e.date<CURRENT_TIMESTAMP()") 
         ->andWhere("e.date > '".$now->format("Y-m-d H:i:s")."'") 
         ->groupBy("u.email") 
         ->orderBy("total","desc"); 
4

Myślę, że to możliwe, ponieważ Twoja e.date jest mapowana jako datetime. Spróbuj przekazać obiekt DateTime zamiast znacznika czasu.

//... 
->andWhere("e.date>?", new DateTime("2011-08-01 00:00:00")) 
//... 

Proszę, opublikuj swoje mapowanie podmiotów, to pomoże ci wyjaśnić źródło twojego błędu.

Aktualizacja: dziwne ... Może to będzie działać:

->andWhere("e.date>'?'", new DateTime("2011-08-01 00:00:00")->format("Y-m-d H:i:s")) 
+0

DateTime daje mi: '/ var/www/Doctrine/ORM/Query/Expr/Base.php (52): Doctrine \\ ORM \\ Zapytanie \\ Expr \\ Base-> add (Object (DateTime)) 'w dzienniku błędów. Zamierzam dodać mapowanie w moim pytaniu. –

+0

Twoja ostatnia propozycja dała mi: Doctrine \ ORM \ Query \ Parser.php (2647): Doctrine \ ORM \ Query \ Parser-> syntaxError ('=, <, <=, <>,> ...'). Więc zmodyfikowałem zgodnie z moją odpowiedzią, aby zrobić lewę. Nie mogę dać ci poprawnej odpowiedzi, ale masz +1 za pomoc w myśleniu o String. –

8

użytkowania parametr zapytania, a następnie ustaw obiekt DateTime jako wartość parametru. Doctrine będzie automatycznie obsługiwać konwersję.

Oto przykładowy kod z własnego projektu

$builder = $this->getEntityManager()->createQueryBuilder(); 
    $builder->select('a') 
     ->from('MaggotsLeadGeneratorBundle:JobApplication', 'a') 
    ; 

    $and = $builder->expr()->andX(); 
    if ($dateFrom) { 
     $and->add($builder->expr()->gt('a.ctime', ':dateFrom')); 
     $builder->setParameter('dateFrom', $dateFrom); 
    } 

    if ($dateTo) { 
     $and->add($builder->expr()->lt('a.ctime', ':dateTo')); 
     $builder->setParameter('dateTo', $dateTo); 
    } 

    $builder->where($and); 
    $query = $builder->getQuery(); 

    $result = $query->getResult(); 
+0

Dzięki za opinie, wypróbuję tę propozycję, gdy mam dwie minuty na zastąpienie mojego "brudnego" rozwiązania. –

+2

Jeszcze lepiej z $ i = $ builder-> expr() -> andX(); – Hauke

+1

Co to jest '$ and'? Nie jest to zadeklarowane w opisie. Dodaj to. – xDaizu

3

Dla mnie to jeden pracował, aby wszystkie wyniki w ciągu ostatnich 30 minut:

$qb = $em->createQueryBuilder(); 
$qb->select('u') 
    ->from('User', 'u') 
    ->where('u.group = '.$this->group->getId()) 
    ->andWhere("u.createdAt > :date") 
    ->setParameter('date', new \DateTime(date("F d Y H:i:s", time() - 30*60))); 
Powiązane problemy