CakePHP自定义字段未由paginator传递

时间:2018-05-31 08:49:16

标签: php cakephp cakephp-3.0

我的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就会通过。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

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

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

另见