0

我在我的 bd 的表中有这个日期字段(date_born),这是一个人的出生日期(类型:日期)。

我使用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 岁)

4

2 回答 2

0

我推荐以下

  • 使用lte表达式比较日期而不是用eq
  • 提供一个 PHP 的实例,DateTime因为 Doctrine 会很乐意接受这一点,并且通常更喜欢对象而不是其他任何东西。
  • 让这个实例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();
}
于 2013-10-21T00:25:56.323 回答
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),所以当我在学说(在数据服务中)进行咨询时,我只需要做一件简单的事情:发送日期“计算”

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();    
}
于 2013-10-21T14:03:55.820 回答