【问题标题】:Doctrine Symfony - Use entity mapping with Raw SQLDoctrine Symfony - 使用带有原始 SQL 的实体映射
【发布时间】:2017-05-30 10:34:05
【问题描述】:

我有多台机器连接到我的数据库中的一堆统计数据,我只需要检索每台机器的最新统计数据。

我通过以下请求使用了学说实体管理器:

$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 文件使用理论实体而不是关联数组。

有没有办法将我的结果映射到实体?或者至少,有没有办法用 DQL 执行类似的请求?

谢谢。

【问题讨论】:

    标签: php symfony doctrine-orm doctrine


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      这是一个非常简单的 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 之间的不匹配)不会出现任何错误,结果将是一个空数组

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多