Как отсортировать запрос Cakephp, используя вычисляемое после поля, и передать его на страницу? - PullRequest
0 голосов
/ 28 мая 2019

Имейте функцию обратного вызова formatResults, которая добавляет поле "пользовательский расчет" в запись сущностей, возвращенную из запроса модели в моем Cakephp.Я хотел бы отсортировать по этому полю и использовать это на страницах, возможно ли это?

Пока что я не могу этого сделать, потому что разбивка на страницы ограничивает выборку записей и, следовательно, сортируются только записи, меньшие, чем предел разбивки на страницы, а не весь набор результатов ...

Текущий код:

    $owners = $this->Owners->find('all');

    $owners->formatResults(function (\Cake\Collection\CollectionInterface $owners) {

        $owners = $owners->map(function ($entity) {

            $entity->random = rand(0,1);

            return $entity;

        });

        return $owners->sortBy(function ($item){

            return $item->random;

        },SORT_DESC);

    });

Это работает, как и ожидалось:

$owners->toArray();

Это не:

$owners = $this->paginate($owners);
$owners->toArray();

Главным образом, потому что его "обработка обратного вызова" только первые 10 записей, я хотел быобработать весь набор результатов.

1 Ответ

0 голосов
/ 29 мая 2019

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

В результате я бы предложил:

1 - либо измените логику модели, чтобы удовлетворить ваши требования, создав виртуальные поля, либо измените схему базы данных, чтобы включить эти данные.

2 - Еслиданные требуют дальнейшей обработки или обработки в реальном времени, и их нельзя добавить или рассчитать в базе данных, возможно, было бы полезно запрограммировать компонент, который будет реплицировать функциональность paginate в коллекции CakePHP. Недостатком этого подхода является то, что все записи будут возвращеныиз базы данных, что может привести к проблемам с производительностью на больших наборах результатов.

...