簡體   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