工作日的Symfony2 createQueryBuilder过滤器记录

时间:2015-07-19 11:03:27

标签: php symfony doctrine

我的查询有问题。我需要在一周中的特定日期选择记录,例如星期一的所有记录。 我不知道如何告诉查询构建者只查看特定的工作日。

这是我的代码:

public function getBookingSerial($dStart) {

    $query = $this->createQueryBuilder('b')
        ->andWhere($this->createQueryBuilder('b')->expr()->like('b.start', ':start'))
        ->setParameter('start', '____-__-__ '.$dStart->format('H:i').':__')
        ->getQuery();

    return $query->getResult();
}

1 个答案:

答案 0 :(得分:2)

假设start存储在Doctrine类型datetime的列中,您将无法在DQL中执行所需的查询(或通过QueryBuilder),因为这一天必须计算一周的时间:它不会直接出现在日期中,而LIKE是不够的。

所有DBMS都提供日期和时间操作功能。例如MySQL has a DAYOFWEEK() function做你想做的事,但是Doctrine本身不支持它们。

包括Luxifer Doctrine Functions在内的一些库提供DQL扩展以支持日期和时间功能。安装此库后,您可以执行以下操作:

public function getBookingSerial($dStart) {
    $query = $this->createQueryBuilder('b')
        ->andWhere('DAYOFWEEK(u.b) = 2')
        ->getQuery();

    return $query->getResult();
}

另一种方法是使用native queries。它不需要任何外部库,但它只适用于您的特定DBMS:

use Doctrine\ORM\Query\ResultSetMapping;

$rsm = new ResultSetMapping();
$rsm->addEntityResult('Booking', 'b');
$rsm->addFieldResult('b', 'id', 'id');
$rsm->addFieldResult('b', 'start', 'start');
// finish your mapping here

$query = $this->_em->createNativeQuery('SELECT id, start FROM Booking WHERE DAYOFWEEK(start) = 2', $rsm);
// Monday is index 2

$users = $query->getResult();