【问题标题】:How do I efficiently load multiple has_many relationships in CodeIgniter DataMapper ORM?如何在 CodeIgniter DataMapper ORM 中有效地加载多个 has_many 关系?
【发布时间】:2013-02-27 21:14:10
【问题描述】:

鉴于以下模型:

类别:has_many(‘模板’) 模板:has_many(‘tag’, ‘procedure’)

加载与所有类别相关的所有对象最有效的方法是什么?

例如,我目前正在做以下事情,但希望有更好的方法:

// 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 多个查询。

【问题讨论】:

  • Datamapper 是否有任何类型的预加载?即:模型::get(array('include'=>array('tags', 'procedures')))。还是 include_related 方法?
  • 是的,以 include_related 的形式,但这不适用于 has_many,因为 Datamapper 的水合目前无法处理查询结果中的重复。
  • 有没有更有效的方法来实现这一点?我正在处理基本相同的情况。我正在加载大约 600 个模型,并且想为每个模型包括相关模型,所以我像你一样循环遍历第一个模型列表,并为每个模型运行 get()。正在运行的查询数量似乎影响了我机器上的可用内存。有没有更有效的方法来做到这一点?
  • @WanWizard 有什么变化我们会看到更新吗?目前这是一个巨大的缺点。而且由于我们过去选择使用 DataMapper,因此切换到另一个解决方案并不容易......
  • @WanWizard 也许一个 auto_populate_has_many_count 选项就可以了??

标签: codeigniter codeigniter-2 codeigniter-datamapper


【解决方案1】:

你可以使用下面的

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 中的自动填充选项,并且您不需要在所有模型上运行 get()

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

希望对你有帮助!

【讨论】:

  • 虽然自动填充所有 has_many 关系将是“高效的”,因为您不必编写尽可能多的 get(),但在资源使用方面可能会非常低效。如果每个父查询都包含许多不必要的子对象,这可能会使代码陷入困境。
  • 有关于这个问题的消息吗?仍然在我们的应用程序中使用 datamapper,我会喜欢一种减少查询量的方法!!!
猜你喜欢
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多