繁体   English   中英

Doctrine Symfony-在Raw SQL中使用实体映射

[英]Doctrine Symfony - Use entity mapping with Raw SQL

我的数据库中有一堆统计信息附加了多台计算机,我只需要检索每个统计信息的最新统计信息。

我将理论实体管理器用于以下请求:

$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();

该请求运行良好且速度不错,但是我无法使用数据。 确实,我的树枝文件使用学说实体而不是关联数组。

有没有办法将我的结果映射到实体中? 或者至少有一种方法可以使用DQL执行类似的请求?

谢谢。

是的,教义提供了一种将本机查询的结果合并为实体的方法。 参见http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/native-sql.html

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

为了使这种映射成为可能,您需要向Doctrine描述结果中的哪些列映射到哪个实体属性。 此描述由ResultSetMapping对象表示。

这是一个非常简单的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配置上(例如SELECTResultSetMapping不匹配), 不会有任何错误,结果将是一个空数组

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM