Doctrine orm 如何使用date()函数/返回含水对象?
在我的Doctrine2实体存储库中,我有以下内容: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(
$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()代码>