2013-02-27 4 views
1

Учитывая следующие модели:Как эффективно загружать несколько отношений has_many в CodeIgniter DataMapper ORM?

Категория: 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', 'procedure'))). или include_related методы? – Philip

+0

Да, в форме include_related, но это не работает для has_many, так как гидратация Datamapper в настоящее время не может обрабатывать повторение в результате запроса. – WanWizard

+1

Есть ли более эффективный способ достичь этого? Я имею дело практически с той же ситуацией. Я загружаю около 600 моделей и хотел бы включить связанные модели для каждого из них, поэтому я просматриваю первый список моделей, как и вы, и запускаю 'get()' для каждого из них. Количество запущенных запросов, по-видимому, влияет на доступность памяти на моей машине. Есть ли более эффективный способ сделать это? – flyingL123

ответ

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 конфигурации приложения/Config/datamapper.php и вам не нужно запускать получить() на всех моделях

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

Надеюсь, это поможет!

+1

Хотя автоматическое заполнение всех отношений has_many будет «эффективным» в том, что вам не придется писать столько же get(), что это может быть невероятно неэффективно с точки зрения использования ресурсов. Если есть много ненужных дочерних объектов, которые включаются в каждый родительский запрос, это может привести к потере кода. – Southerneer

+0

Любые новости по этой проблеме? Все еще используя datamapper в нашем приложении, и я бы ЛЮБЛЮ способ уменьшить количество запросов !!! – Brainfeeder