2017-07-25 26 views
0

我有以下DQL查詢:如何正確檢索從多條記錄一對多的關係(原則 - 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),這是造成問題,它導致以下錯誤:

Error: Maximum execution time of 30 seconds exceeded at /vendor/doctrine/orm/lib/Doctrine/ORM/Internal/Hydration/AbstractHydrator.php:296)"}

任何人都可以點我解決這個錯誤方向是正確的?

+0

錯誤它在PHP中,所以你必須在php.ini中增加php時間執行時間max_execution_time –

+1

我不想走這條路。我想優化查詢,因此運行時間不會很長。 – Sid

+1

您應該調試並檢查查詢是否正常工作或不... 對於那個臨時添加=>「set_time_limit(0);」 如果查詢執行成功,那麼我認爲我們可以優化後 – Kunal

回答

0

那麼,查詢和填充9個不同的互連實體的集合將做到這一點。 但是,如果沒有更多關於整個模型的知識,我們不能說在查詢中可以改變什麼。

也許你可以嘗試尋找可以非規範化到其他表的方法來避免額外的連接。 或者,如果你不需要在一個超級表中的所有東西,也許你可以更多地拆分查詢。

這真的取決於你所需要的結果集爲

+0

結果集由AJAX調用用來填充表單中的選擇元素。 – Sid

+0

在這種情況下,您可能不需要在一張巨大的表中包含所有內容。您可以在單獨的查詢中檢索表並將它們返回到單個數組中以避免額外的ajax調用。你可能不需要整個對象。只需選擇你需要的字段 – Dimitris

0

Hyradrate複雜的結果集爲目標樹是昂貴的操作。隨着輸入大小的增加(來自數據庫的更多行)以及隨着您將更多實體加入樹(多對多關聯),它需要越來越多的時間來構建對象樹。在數學中,你的問題描述爲Bachmann–Landau notation

你可以嘗試所謂的Multi-step Hydration

相關問題