在我的Doctrine2实体存储库中,我有以下内容:
$date = new DateTime('NOW');
$date = $date->format('Y-m-d');
if ($region) {
$region_sql = " AND WHERE region LIKE ?3 ";
} else {
$region_sql = "";
}
$sql = "SELECT *, count(month) as count FROM (SELECT *, date(date_from, 'start of month', '+1 month', '-1 day') as month FROM manifestations WHERE date_to >= :date_to " . $region_sql . ") GROUP BY month";
$stmt = $em->getConnection()->prepare($sql);
$stmt->bindValue(':date_to', $date);
if($region) {
$stmt->bindValue(3, sprintf('%%,%s,%%', $region));
}
$stmt->execute();
return $stmt->fetchAll();
但我需要更改它,以便它返回水合物而不是数组。我原本想使用DQL或queryBuilder,但找不到让date()函数起作用的方法。
答案 0 :(得分:1)
使用NativeQuery
,您可以执行本机SELECT SQL语句并将结果映射到Doctrine实体或Doctrine支持的任何其他结果格式。
使用ResultSetMappingBuilder
可以实现您想要做的事。
ResultSetMappingBuilder
是一个方便的包装器。它可以根据实体为您生成映射。
我就是这样做的(我假设您的查询有效,也许您必须对其进行调整,因为我将使用新的别名):
创建ResultSetMapping
:
use Doctrine\ORM\Query\ResultSetMapping;// Don't forget this
$rsm = new ResultSetMappingBuilder($entityManager);// $entityManager points to your entity manager.
$rsm->addRootEntityFromClassMetadata('path/to/class/MyClass', 'a');// Notice the a, it's an alias that I'll later on use in the query.
$rsm->addScalarResult("count", "count");// column, alias
像在代码中一样准备$region_sql
部分,并将a
别名添加到要映射的内容中。 a.*
将映射到一个对象(注意我在查询中使用的as a
):
$sql = "SELECT a.*, count(month) as count FROM (SELECT *, date(date_from, 'start of month', '+1 month', '-1 day') as month FROM manifestations WHERE date_to >= :date_to " . $region_sql . ") as a GROUP BY month";
执行查询:
$query = $entityManager->createNativeQuery($sql, $rsm);
$query->setParameter('date_to', $date);
$result = $query->getResult();
这将为您提供一系列行。它们中的每一个都是一个混合数组,$result[n][0]
将包含object
和$result[n]["count"]
查询的count
列的值(列的名称与我们在$rsm
中设置的别名,其中n
是行的编号。