2013-09-16 2 views
0

У меня есть это поле даты (date_born) в таблице в моем bd, которая является датой рождения человека (тип: дата).Как манипулировать датами в доктрине

im использование codeignater, а также использование доктрины.

дело в том, что я хочу, чтобы подсчитать, сколько люди взрослые и сколько дети, поэтому я построил это:

public function countAdults(){ 
    $this->qb = $this->em->createQueryBuilder(); 
    $this->qb->select('count(u)') 
      ->from($this->tbl_name, 'u') 
      ->where(
       $this->qb->expr()->eq("u.date_born >'1995-01-01'") 
       ); 

    $query = $this->qb->getQuery(); 
    return $query->getSingleScalarResult(); 
} 

это явно, возвращается ошибка.

Как я могу перестроить это, в оптимальном порядке, чтобы подсчитать людей, которые родились до 1995 года? (Теперь 18)

ответ

0

я рекомендую следующий

  • Используйте выражение lte сравнить даты вместо оценки с eq
  • Обеспечить экземпляр РНР DateTime в Доктрине будет счастливо признать, что и в целом предпочитает объекты над чем-либо еще.
  • Чтобы этот экземпляр DateTime автоматически вычислил, когда 18 лет назад был, так что вам не нужно менять его каждый год.
  • Чтобы связать этот объект с методом setParameters().

Метод:

public function countAdults() 
{ 
    $eighteenYearsAgo = new \DateTime(); 
    $eighteenYearsAgo->modify('-18 years'); 

    $this->qb = $this->em->createQueryBuilder(); 
    $this->qb->select('count(u)') 
     ->from($this->tbl_name, 'u') 
     ->where(
      $qb->expr()->lte('u.date_born', ':date_born')) 
     ) 
     ->setParameters(array(
      'date_born' => $eighteenYearsAgo, 
     )) 
    ; 

    return $this->qb->getQuery()->getSingleScalarResult(); 
} 
+1

отличное решение, я опубликую, как я его обработал, но я думал об использовании вашего предложения – Limon

0

это то, что я сделал, чтобы создать решение для моего предыдущего вопроса,

Я поставил этот метод в моем администратора:

public function controlAge(){ 

$date = new \DateTime(); 
$var = $date->format('Y-m-d'); 
$dateArray = explode('-', $var); 

$year = strval(($dateArray[0])-(18)); 
$month = $dateArray[1]; 
    $day = $dateArray[2]; 

$d = $year.'-'.$month.'-'.$day; 
$newDate = date('Y-m-d', strtotime($d)); 

return $newDate; 
} 

, который вычисляет дату, основанную на фактической дате, чтобы контролировать, является ли пользователь взрослым или нет (+18), поэтому, когда я выполняю консультации в доктрине (в службе данных), мне просто нужно d o простая вещь: отправка даты «вычислен»

public function countAdults($fecha){ 

$this->qb = $this->em->createQueryBuilder();    
$this->qb->select('count(u)') 
->from($this->tbl_name, 'u') 
->where('u.date_born <= :var') 

    ->setParameter('var', $fecha); 
$query = $this->qb->getQuery();   
return $query->getSingleScalarResult();  
} 
Смежные вопросы