CakePHP:formatResults()和combine()
假设我有这个CakePHP:formatResults()和combine(),cakephp,cakephp-3.0,Cakephp,Cakephp 3.0,假设我有这个find(): 现在,我希望slug字段将是数组键 现在我使用一个(可怕的)循环: $categories的调试示例: ########## DEBUG ########## [ 'first-page-category' => object(MeCms\Model\Entity\PagesCategory) { 'title' => 'First page category', 'slug
find()
:
现在,我希望slug
字段将是数组键
现在我使用一个(可怕的)循环:
$categories
的调试示例:
########## DEBUG ##########
[
'first-page-category' => object(MeCms\Model\Entity\PagesCategory) {
'title' => 'First page category',
'slug' => 'first-page-category',
'page_count' => (int) 1,
'[new]' => false,
'[accessible]' => [
'*' => true
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[invalid]' => [],
'[repository]' => 'MeCms.Categories'
},
'sub-sub-page-category' => object(MeCms\Model\Entity\PagesCategory) {
'title' => 'Sub sub page category',
'slug' => 'sub-sub-page-category',
'page_count' => (int) 2,
'[new]' => false,
'[accessible]' => [
'*' => true
],
'[dirty]' => [],
'[original]' => [],
'[virtual]' => [],
'[errors]' => [],
'[invalid]' => [],
'[repository]' => 'MeCms.Categories'
}
]
###########################
这造成了两个问题:
- 这是一种可怕的方法李>
- 在更改数组键之前缓存数据,然后每次都必须执行相同的循环
Cache::read()
和Cache::write()
。例如:
$categories = Cache::read('widget_categories');
if (empty($categories)) {
//Find...
//Loop for changing keys...
Cache::write('widget_categories', $categories);
}
$categories = $this->Pages->Categories->find('active')
->select(['title', 'slug', 'page_count'])
->order(['title' => 'ASC'])
->formatResults(function ($results) {
return $results->combine('slug', function ($row) {
return $row;
});
})
->cache('widget_categories')
->toArray();
然而,在我看来,最好的解决方案是使用formatResults()
和combine()
方法。例如:
$categories = Cache::read('widget_categories');
if (empty($categories)) {
//Find...
//Loop for changing keys...
Cache::write('widget_categories', $categories);
}
$categories = $this->Pages->Categories->find('active')
->select(['title', 'slug', 'page_count'])
->order(['title' => 'ASC'])
->formatResults(function ($results) {
return $results->combine('slug', function ($row) {
return $row;
});
})
->cache('widget_categories')
->toArray();
对吗?是否有更简单的方法和/或使代码更具可读性
谢谢。对我来说似乎非常清楚和简单…@ndm,只是一个问题。我知道我不能直接使用
Collection
方法,因为这将返回Collection
对象,而cache()
方法将失败。因此,我必须使用formatResult()
方法,然后在其内部调用Collection
方法。是否正确?调用cache()
后可以使用收集方法。调用集合方法将导致首先执行查询。您是最好使用结果格式化程序,还是对返回的数据进行操作,通常取决于您希望如何缓存、格式化或原始数据。