如何使用date()函数/返回水合物体?

时间:2015-01-20 08:20:58

标签: 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(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()函数起作用的方法。

1 个答案:

答案 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是行的编号。