簡體   English   中英

如何正確地從多對多關系中檢索記錄(Doctrine-DQL查詢)

[英]How to correctly retrieve records from a many to many relationship (Doctrine - DQL query)

我有以下DQL查詢:

$qb->select('v, b, c, t, p, m, s, f, h')
    ->from('UrlBuilderBundle:Version', 'v')
    ->leftJoin('v.ddlBrands', 'b', 'WITH', 'b.version = v.id AND b.isActive = 1 AND v.isActive = 1')
    ->leftJoin('v.ddlCampaignObjectives', 'c', 'WITH', 'c.version = v.id AND c.isActive = 1')
    ->leftJoin('v.ddlThemes', 't', 'WITH', 't.version = v.id AND t.isActive = 1')
    ->leftJoin('t.ddlProducts', 'p', 'WITH', 'p.isActive = 1')
    ->leftJoin('v.ddlMediums', 'm', 'WITH', 'm.version = v.id AND m.isActive = 1')
    ->leftJoin('m.ddlSources', 's', 'WITH', 's.ddlMedium = m.id AND s.isActive = 1')
    ->leftJoin('v.fields', 'f', 'WITH', 'f.version = v.id AND f.isActive = 1')
    ->leftJoin('f.helpText', 'h', 'WITH', 'h.field = f.id AND h.isActive = 1');

$query = $qb->getQuery();
$versions = $query->getArrayResult();

所有指定的聯接都在具有多對一/一對多關系的表之間,除了ddlProducts和ddlThemes表之間。 存在多對多關系(ddlProducts和ddlThemes),這會引起問題,並導致以下錯誤:

錯誤:在/vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php:296)中超過了30秒的最大執行時間

誰能指出我正確的方向來解決這個錯誤?

好了,查詢和填充9個不同的互連實體的集合將做到這一點。 但是如果您不了解整個模型,我們就無法說出查詢中可以更改的內容。

也許您可以嘗試查找可以反規范化為其他表的表,以避免額外的聯接。 或者,如果您不需要一個uber表中的所有內容,則可以將查詢拆分成更多。

這實際上取決於您需要什么結果集

將復雜的結果集水化為對象樹是昂貴的操作。 隨着輸入大小的增加(數據庫中更多的行),以及將更多的實體連接到樹中(多對多關聯),ORM需要花費越來越多的時間來構建對象樹。 在數學中,您的問題描述了Bachmann–Landau符號

您可以嘗試所謂的“ 多步水合”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM