如何使用 date() 函数 / return 水合对象?

How to use date() function / return hydrated objects?

在我的 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();

但我需要对此进行更改,以便 returns 水合对象而不是数组。我最初想使用 DQL 或 queryBuilder,但找不到使 date() 函数起作用的方法。

使用 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 是行号。