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()
后可以使用收集方法。调用集合方法将导致首先执行查询。您是最好使用结果格式化程序,还是对返回的数据进行操作,通常取决于您希望如何缓存、格式化或原始数据。