【发布时间】: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