我的数据库中有多个统计信息附加了多台计算机,我只需要检索每个机器的最新统计信息。
我使用了doctrine实体管理器并提出了以下请求:
$str = "SELECT s, sa.slug ";
$str .= "FROM AppBundle:Statistique s ";
$str .= "LEFT JOIN AppBundle:StatistiqueAnomalie sa WITH (s.anomalie = sa.num) ";
$str .= "LEFT JOIN AppBundle:Statistique sp WITH (s.numserieMachine = sp.numserieMachine AND s.datecrea < sp.datecrea) ";
$query = $this->getEntityManager()->createQuery($str);
//var_dump($query->getSql());
return $query->getResult();
但是这个请求非常慢(约22秒),所以我想用原始sql中更优化的替换它:
$str = "SELECT * FROM
( SELECT numserie_machine, MAX( datecrea ) as ma FROM statistique GROUP BY numserie_machine ) as maxv
INNER JOIN statistique s on maxv.numserie_machine=s.numserie_machine and maxv.ma=s.datecrea
LEFT JOIN statistique_anomalie sa on s.anomalie=sa.num";
$conn = $this->getEntityManager()->getConnection();
$query = $conn->prepare($str);
$query->execute([]);
return $query->fetchAll();
此请求运行良好且速度不错,但我无法使用数据。实际上,我的twig文件使用的是doctrine实体而不是关联数组。
有没有办法将我的结果映射到enities?或者至少,有没有办法用DQL执行类似的请求?
谢谢。
答案 0 :(得分:2)
是的,doctrine提供了一种方法,可以将本机查询的结果水合成实体。 见http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/native-sql.html
使用NativeQuery,您可以执行本机SELECT SQL语句和映射 结果到Doctrine实体或支持的任何其他结果格式 由Doctrine撰写。
为了使这种映射成为可能,您需要描述 Doctrine结果中的哪些列映射到哪个实体属性。这个 description由ResultSetMapping对象表示。
答案 1 :(得分:0)
这是一个非常简单的带有理论的SQL->实体映射的示例。这个想法是使用ResultSeteMapping
。棘手的部分是正确生成SELECT
部分。希望它将带领某人走上正确的道路:
class MyAwesomeEntityRepository extends EntityRepository
{
/*
* @returns array|MyAwesomeEntity[]
*/
public function findSomething(): array
{
$rsm = $this->createResultSetMappingBuilder('my_alias');
$select = $rsm->generateSelectClause(['my_alias']);
$sql = <<<SQL
SELECT $select
FROM MyAwesomeEntity AS my_alias
LIMIT 10;
SQL;
$query = $this->getEntityManager()->createNativeQuery(
$sql,
$rsm
);
return $query->getResult();
}
}
注意:在错误的ResultSetMapping
配置下(例如SELECT
和ResultSetMapping
之间的不匹配),不会有任何错误,结果将是一个空数组 >。