【问题标题】:CakePHP custom field not passed by paginator分页器未传递 CakePHP 自定义字段
【发布时间】:2018-05-31 08:49:16
【问题描述】:

我的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'));
    }

但是,在我看来,image_count 没有通过。不使用 Paginator 就可以通过。

我该如何解决这个问题?

【问题讨论】:

    标签: php cakephp cakephp-3.0


    【解决方案1】:

    分页器将选项应用于查询,例如限制,这将导致查询被标记为脏,这反过来会清除任何可能缓冲的结果集,所以你正在做的是迭代一个要删除的结果设置和修改将无处可去的对象(实体)。

    您根本不应该依赖缓冲的结果集,如果您需要可靠地修改查询的结果,那么您应该使用结果格式化程序或 ma​​p/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');
    

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

    另见

    【讨论】:

    • 感谢您的广泛回答!我一回家就会测试它。我确实看到了计数器缓存功能,但没有让它与链接和取消链接数据一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    相关资源
    最近更新 更多