2013-02-27 50 views
1

鑑於以下型號:如何在CodeIgniter DataMapper ORM中有效地加載多個has_many關係?

類別:的has_many(「模​​板」) 模板:的has_many(「標籤」,「過程」)

什麼是加載相關的所有類別的所有對象的最有效方法?

舉例來說,我目前在做以下,但希望有一個更好的辦法:

// Load all Category objects 
$categories = new Category(); 
$categories->get(); 

// Load all Template objects related to each Category 
foreach($categories as $category) 
{ 
    $category->templates->get(); 

    // Load all the Tag and Procedure objects related to each template 
    foreach($category->templates as $template) 
    { 
    $template->tags->get(); 
    $template->procedures->get(); 
    } 
} 

眼下這個代碼正在執行一個特定的頁面上超過200個查詢。

+0

Datamapper是否有任何類型的急切加載?即:Model :: get(array('include'=> array('tags','procedures')))。或include_related方法? – Philip 2013-02-28 01:11:13

+0

是的,以include_related的形式,但不適用於has_many's,因爲Datamapper的水合目前無法處理查詢結果中的重複。 – WanWizard 2013-03-04 17:08:48

+1

有沒有更高效的方法來完成這個?我正在處理基本相同的情況。我加載了大約600個模型,並且希望爲每個模型包含相關模型,所以我正在循環訪問第一個模型列表,併爲每個模型運行'get()'。正在運行的查詢的數量似乎影響了我的機器上可用的內存。有沒有更有效的方法來做到這一點? – flyingL123 2014-06-18 20:43:34

回答

0

您可以使用以下

foreach($categories as $category) 
    { 
     // here you can use the $category object 
     foreach($category->templates as $template){ 
      // here you can use the $template object 
      foreach($template->tags as $tags){ 
       // here you can use the $tags object 
      } 
      foreach($template->procedures as $proceadures){ 
       // here you can use the $proceadures object 
      } 
     } 
    } 

確保您已激活的DataMapper的配置的application/config/datamapper.php的自動填充選項,你不需要運行得到()所有車型的

$config['auto_populate_has_many'] = TRUE; 
$config['auto_populate_has_one'] = TRUE; 

希望它有幫助!

+1

雖然自動填充所有has_many關係將「高效」,因爲您不必編寫儘可能多的get(),但在資源使用方面效率可能非常低。如果每個父查詢都包含大量不必要的子對象,則可能導致代碼停滯。 – Southerneer 2014-07-28 12:57:34

+0

關於這個問題的任何消息?仍然在我們的應用程序中使用數據映射器,我會愛好減少查詢量的方法! – Brainfeeder 2015-09-11 13:24:13

相關問題