Пользовательское поле CakePHP не передано paginator - PullRequest
0 голосов
/ 31 мая 2018

У меня есть этот метод в моем 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 голосов
/ 31 мая 2018

paginator применяет параметры к запросу, такие как ограничение, которое заставит запрос помечаться как грязный, что, в свою очередь, очищает все возможные буферизованные наборы результатов, поэтому то, что вы делаете, выполняет итерацию по удаляемому результатуустанавливать и модифицировать объекты (сущности), которые сойдут в никуда.

Вы не должны полагаться на буферизованные наборы результатов вообще, если вам нужно надежно изменить результаты запроса, тогда вы должны использовать результатformatter или map / lower, которые оба применяются к результатам каждый раз, когда выполняется запрос:

$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');

И, конечно, также есть поведение кэша счетчика.

См. также

...