Можно ли разбить на страницы пользовательский запрос, не перекрывая нумерацию по умолчанию? - PullRequest
1 голос
/ 27 сентября 2011

В моем приложении CakePHP (1.2) у меня есть два действия, которые оба используют разбиение на страницы - индексирование и поиск.

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

Все руководства, которые я могу найти для разбиения на страницы пользовательских запросов, включают переопределение методов paginate() и paginateCount()..

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

Есть ли способ, которым я могу (Гм) есть мой торт и есть его тоже?

Ответы [ 2 ]

3 голосов
/ 27 сентября 2011

На самом деле, если вы можете сделать это с помощью поиска, вы можете сделать это с помощью пагинации.Вы можете посмотреть здесь

Но чтобы быть более конкретным, вы можете добавить условия / limit / fields / contains / order и т. Д., Которые вы используете в find, к функции paginate.

Я не использую группу в paginate, но она ДОЛЖНА работать: D

В вашем случае у вас будет что-то вроде этого:

$this->paginate = array(
   'fields' => array(
        'Product.category_id',
        'COUNT(Product.hotel_id) as total'
    ),
   'group' => array(
        'Product.category_id HAVING COUNT(Product.hotel_id) > 1')
    )
);

$data = $this->paginate('Product');

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

РЕДАКТИРОВАТЬ:

Вы можете попытаться сделать что-то вроде этого:

Переопределить paginate () и paginateCount (), но с помощью твика подберите условие, чтобы вы могли определить, является ли это нумерацией страниц сне.Примерно так:

function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array()){
   //if no having conditions set return the parent paginate 
   if (empty($conditions['having'])
       return parent::paginate($conditions, $fields, $order, $limit, $page, $recursive, $extra)
   //if having conditions set return your override

//override code here

}

Затем вы делаете нечто подобное в paginateCount (), таким образом, у вас есть выборочный paginate.не забывайте делать неустановленные $ условия ['имеющие'], когда это не нужно, или не забудьте поместить его где-нибудь, что не повлияет на вашу находку;)

1 голос
/ 28 сентября 2011

На самом деле заставить его работать больше было головной болью, чем вы могли бы разумно ожидать.

Хотя я в основном следовал совету api55 (спасибо!), Я также преодолел множество других препятствий:

  • Это невозможно сделать parent::paginateCount(). Я преодолел это, переопределив его с другой (и, видимо, лучшей) версией в app_model.php.

  • Поскольку paginateCount() является просто оболочкой для find('count'), он не принимает параметр fields. Это сложно для меня, поскольку я полагаюсь на это, чтобы втиснуться в мой производный столбец (оценка полнотекстового поиска). Я преодолел это, передав значение fields дважды в paginate - один раз как fields и один раз как "sneaky". Cake помещает любые параметры, которые он не распознает, в массив extra.

  • Связав это вместе, у меня в моей модели было переопределение paginateCount(), которое проверяет, есть ли у extra ключ, называемый "подлый". Если это так, он выполняет find('all') и использует содержимое sneaky для заполнения полей.

В наши дни, как сегодня, я должен отступить назад и вспомнить все хорошие моменты об использовании фреймворка.

...