Symfony2 createQueryBuilder 在工作日过滤记录
Symfony2 createQueryBuilder filter records on weekdays
我的查询有问题。我需要 select 一周中特定一天的记录,例如星期一的所有记录。
我不知道如何告诉查询生成器只查找特定的工作日。
这是我的代码:
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();
}
假设 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();
我的查询有问题。我需要 select 一周中特定一天的记录,例如星期一的所有记录。 我不知道如何告诉查询生成器只查找特定的工作日。
这是我的代码:
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();
}
假设 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();