我的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就会通过。
我该如何解决这个问题?
答案 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');
当然还有计数器缓存行为。
另见