Пагинация пользовательских запросов Cakephp

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

    $cars = $this->Car->query(" select Car.id, Car.make, Car.model, Car.year, Car.description, CarImage.thumbnail
                                    from cars Car
                                    inner join car_images CarImage on Car.default_image_id = CarImage.id
                                    where Car.make like '" . $category . "'
                                    order by Car.created DESC
                                    limit 10");
    $this->set('cars', $cars);

person Hooman Ahmadi    schedule 05.12.2009    source источник


Ответы (5)


Реализуйте paginate и paginateCount в своей модели:

function paginate($conditions, $fields, $order, $limit, $page, $recursive, $extra)
{
    return $this->query('SELECT ...');
}

function paginateCount($conditions, $recursive, $extra)
{
    return $this->query('SELECT COUNT(.....');
}

Также проверьте функцию разбиения на страницы в: cake / libs / controller / controller.php

person GJ.    schedule 08.12.2009

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

Вы должны установить в своих моделях следующие отношения:

Автомобиль hasMany (или hasOne) CarImage
CarImage принадлежит автомобилю

Тогда вы сможете получить эти точные данные, используя следующее:

<?php
class CarsController extends AppController {
  var $paginate = array('limit'=>'10',
                        'order'=>'Car.created',
                        'fields'=>array('Car.model','Car.year','Car.description',
                                        'CarImage.thumbnail'));

  function test() {
    // not sure where you are getting the where clause, if its from some form
    // you'll want to check look in $this->data
    $category = "somevalue";
    // set the LIKE condition
    $conditions = array('Car.make LIKE' => '%'.$category.'%');
    // apply the custom conditions to the pagination
    $this->set('cars', $this->paginate($conditions);
  }
}
?>

Для получения дополнительной информации о сложных условиях поиска (которые можно применить к разбиению на страницы, передав массив, как я сделал в приведенном выше примере): http://book.cakephp.org/view/74/Complex-Find-Conditions

person spelley    schedule 27.12.2009
comment
как насчет того, когда запрос вызывает хранимую процедуру, которая возвращает набор результатов, который не является этой моделью? т.е. возвращает структуру таблицы, отличную от модели. как можно разбить такой сценарий на страницы? у меня эта функция есть в модели public function GetSummary(){ $sql="CALL main_report()"; return $this->query($sql); } - person indago; 16.11.2013

В Cake 3 вы можете использовать глухой пагинатор с функцией find ().

Следуй примеру:

$query = $this->Car->find()
                ->select(['Car.id', 'Car.make','Car.model','Car.year','Car.description','CarImage.thumbnail'])
                ->join([
                        'table' => 'CarImage',
                        'alias' => 'CarImage',
                        'type' => 'INNER',
                        'conditions' => 'CarImage.id = Car.default_image_id,
                ])
                ->where(['Car.make LIKE' => '%$category%'])
                ->order(['Car.created' => 'DESC'])
                ->limit(50)

        $cars = $this->paginate($query);

        $this->set(compact('cars'));
        $this->set('_serialize', ['cars']);
person Alexandre Strapacao G. Vianna    schedule 23.03.2016

Предложение mysql limit поддерживает объем и смещение, поэтому 10 результатов на страницу ....

select * from table limit 0, 10

Страница 1

select * from table limit 10, 10

страница 2

select * from table limit 20, 10

стр. 3

select * from table limit ($page-1)*$perPage, $perPage

Универсальный

person Paul Creasey    schedule 05.12.2009
comment
Я надеялся на что-то, что использует функцию разбиения на страницы в cakephp - person Hooman Ahmadi; 05.12.2009

Предложение mysql limit поддерживает объем и смещение, поэтому 10 результатов на страницу ....

person jacky    schedule 29.09.2010