CakePHP передает пользовательский запрос из контроллера в модель paginate () - PullRequest
1 голос
/ 12 января 2012

Я использую Cakephp 2.X версию

Я собираюсь запустить sql как:

 SELECT field1, field2, field3, field3,
            ( IF(LOCATE('abc', field1), 4, 0) + IF(LOCATE('abc', field2), 3, 0) + IF(LOCATE('abc', field3), 2, 0) ) AS score
            FROM sometable
            WHERE ( (field1 LIKE '%abc%')  OR  (field2 LIKE '%abc%')  OR  (field3 LIKE '%abc%') )
            ORDER BY score DESC

этот sql генерируется кодом динамически. Таким образом, этот sql нужно передать в функцию paginate (), чтобы сделать нумерацию с помощью cakephp. Похоже, что функция разбивки на страницы CakePHP недостаточно гибкая, чтобы справляться со сложными SQL.

Чтобы выполнить этот сложный sql, Как я могу переопределить paginate (), чтобы разбить на страницы мой результат?

Описание:

Я пытаюсь сделать пользовательский запрос нумерации страниц. Контроллер получает ключевые слова и генерирует SQL, я хочу передать строку SQL в функцию public function paginate(Model $model, $conditions, $fields, $order, $limi ...), которая переопределена в Model для запуска этого пользовательского запроса. Как я могу передать строку SQL в функцию paginate.

Любое предложение или подсказка, пожалуйста?

1 Ответ

2 голосов
/ 12 января 2012

Короткий ответ на ваш вопрос заключается в том, что вы не можете разбивать свои данные на страницы с помощью этого запроса - или при использовании вычисляемых полей в целом. Как вы, вероятно, заметили, данные, особенно в ваших вычисляемых полях, не возвращаются в торт в формате массива data -> Model -> variable. Скорее, он возвращается как индексированный массив.

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

Поскольку при выполнении поиска виртуальные поля во многом похожи на обычные поля, Controller :: paginate () также сможет сортировать по виртуальным полям.

...