“where”条款只有月份

时间:2016-04-29 14:44:00

标签: mysql symfony doctrine

我想要做的是在给定月份的数据库中完成所有的休假。

我尝试了多种解决方案,但都没有。我结束了与学说(有点)的黑魔法。

这是我的最后一次尝试:

public function getNbCongesByMonth($month){
    $listOfEntities = $this->createQueryBuilder('e')
        ->select('count(e) as nb, SUBSTRING(e.cngDateDebut, 6, 2) as day')
        ->where('day = :month')
        ->setParameter('month', $month)
        ->getQuery()
        ->getResult();
    return $listOfEntities;
}

请求应该在数据库中返回精确月份的“Conges”数量。

有了这个请求,我收到了这个错误:

An exception occurred while executing 'SELECT count(c0_.CNG_ID) AS sclr0, SUBSTRING(c0_.CNG_DATE_DEBUT FROM 6 FOR 2) AS sclr1 FROM Conges c0_ WHERE sclr1 = ?' with params ["5"]:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'sclr1' in 'where clause' 

我不知道如何做到这一点,所以如果有人有一个很棒的解决方案。

提前致谢。

1 个答案:

答案 0 :(得分:1)

如果对datetime属性使用cngDateDebut类型,则可以使用基于MySQL使用的like()格式的YYYY-MM-DD HH:MM:SS条件:

public function getNbCongesByMonth($month){
    $qb = $this->createQueryBuilder('e');

    $listOfEntities = $qb
        ->select('count(e) as nb')
        ->where(
            $qb->expr()->like('e.cngDateDebut',
                $qb->expr()->literal('%-'.$month.'-%')
            )
        )
        ->getQuery()
        ->getResult();
    return $listOfEntities;
}

如果你想计算某一年某个月的休假天数:

public function getNbCongesByMonth($year, $month){
    $qb = $this->createQueryBuilder('e');

    $listOfEntities = $qb
        ->select('count(e) as nb')
        ->where(
            $qb->expr()->like('e.cngDateDebut',
                $qb->expr()->literal($year.'-'.$month.'-%')
            )
        )
        ->getQuery()
        ->getResult();
    return $listOfEntities;
}

%是一个匹配任何内容的关键字,因此对于$month = 04'%-'.$month.'-%',模式将为'%-04-%',此模式将与2016-04-…'匹配,{{ 1}}等等。