Doctrine orm 如何使用date()函数/返回含水对象?

Doctrine orm 如何使用date()函数/返回含水对象?,doctrine-orm,zend-framework2,Doctrine Orm,Zend Framework2,在我的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(

在我的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()函数工作的方法。

使用它,您可以执行本机SELECT SQL语句,并将结果映射到条令实体或条令支持的任何其他结果格式

您想要做的事情可以通过使用来实现

resultstMappingBuilder
是一个方便的包装器。它可以基于实体为您生成映射

我就是这样做的(我假设您的查询可以工作,也许您需要调整它,因为我将使用一个新的别名):

创建
结果映射

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\u sql
部件,并将
a
别名添加到要映射的任何对象
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]
将包含
对象
$result[n][“count”]
查询的
count
列的值(列的名称与我们在
$rsm
中设置的别名相同)其中
n
是行数。

用于在DQL中使用日期函数。我不确定您是否可以使用SQL,然后使用Doctrine来水合实体。这或多或少是我这样做的,但是我使用了
DisconnectedClassMetadataFactory
,并循环实体的元数据来添加所有要“水合”的列:
$rsm->addFieldResult('m',$obj[“columnName”],$obj[“fieldName”)-这样我就可以调用
$object->getFieldName()