代码之家  ›  专栏  ›  技术社区  ›  GreyRoofPigeon

paginator未传递cakephp自定义字段

  •  0
  • GreyRoofPigeon  · 技术社区  · 7 年前

    我有这个方法 PhotoalbumsModel

    public function index_list()
    {
        $data = $this->find()
        ->contain(['Images' => function($q) {
                $q->select([
                     'total' => $q->func()->count('image_id')
                ])
                ->group(['photoalbum_id']);
                return $q;
            }
        ]);
    
        foreach ($data as $row)
        {
            $row->image_count = 0;
            if (isset($row->images{0}->total))
            {
                $row->image_count = $row->images{0}->total;
            }
            unset($row->images);
        }       
        return $data;
    }
    

    巴西卡利补充说 image_count 排成一排。

    在我的控制器中,我使用:

    <?php
    class PhotoalbumsController extends AppController
    {
        public $paginate = [
            'limit' => 2,
            'order' => ['id' => 'desc']
        ];
    
        public function index()
        {
            $photoalbums = $this->paginate($this->Photoalbums->index_list());
            $this->set(compact('photoalbums'));
        }
    

    然而,在我看来 图像计数 没有通过。不使用分页器就可以传递。

    我该怎么解决?

    1 回复  |  直到 7 年前
        1
  •  0
  •   ndm    7 年前

    paginator将选项应用于查询,例如limit,它将导致查询被标记为dirty,进而清除任何可能缓冲的结果集,因此您所做的是遍历一个要删除的结果集,并修改将下降到n的对象(实体)。哦。

    您根本不应该依赖缓冲结果集,如果您需要可靠地修改查询的结果,那么您应该使用结果格式化程序或map/reduce,这两种方法都在每次执行查询时应用于结果:

    $query = $this
        ->find()
        ->contain([
            'Images' => function($q) {
                $q
                    ->select([
                        'total' => $q->func()->count('image_id')
                    ])
                    ->group(['photoalbum_id']);
    
                return $q;
            }
        ])
        ->formatResults(function (\Cake\Collection\CollectionInterface $results) {
            return $results->map(function ($row) {
                $row['image_count'] = $row['images'][0]['total'];
    
                return $row;
            });
        });
    
    return $query;
    

    也就是说,您还可以在SQL级别直接处理此问题,方法是加入关联而不是包含关联,并在主查询中选择列:

    $query = $this->find();
    $query
        ->select(['image_count' => $query->func()->count('Images.id')])
        ->enableAutoFields()
        ->leftJoinWith('Images')
        ->group('Photoalbums.id');
    

    当然还有计数器缓存行为。

    另见