CakePHP нумерация страниц, как мне отсортировать по количеству содержавшейся модели? - PullRequest
0 голосов
/ 10 октября 2019

Используя CakePHP 2.3, я извлекаю данные с помощью пагинатора. Итак, скажем, что моими моделями являются страны, имеющие много городов, и в моем CountryController у меня есть ...

$this->Paginator->settings = [
    'fields' => [
         'id'
         'country_name'
     ],
     'contain' => [
         'City' => [
             'id'
             'city_name',
             'conditions' => [
                 'population >' => 1000000;
             ]
         ]
     ]
];

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

В представлении я, очевидно, могу повторять foreach ($cities as $city) и echo $country['country_name'] и т. Д., А также, если я хочу, я могу показать количество содержащихся городов, отображая count($country['City']).

Используя paginator, я могу сортировать результаты по стране, передавая обратно имя поля в строке запроса, например, sort=country_name, но как я могу получить результаты для сортировки по количеству содержащихся городов?

1 Ответ

0 голосов
/ 11 октября 2019

К сожалению, невозможно отсортировать по количеству таблицы hasMany с помощью пользовательской разбивки на страницы Cakephp. Лучше всего использовать counterCache, как описано в Документах .

. Вам необходимо иметь поле в таблице стран, названное city_count. Это поле будет автоматически обновляться в Таблице стран при помощи Cakephp всякий раз, когда в таблице city выполняется операция сохранения.

Поскольку вы хотите считать только города с населением> 100K. Вы можете указать условие в counterScope, которое будет обновлять столбец только при выполнении условия.

Это может быть определено в вашей модели города следующим образом:

class City extends AppModel {
    public $belongsTo = array(
        'Country' => array(
            'counterCache' => true,
            'counterScope' => array(
              'City.population > ' => 1000000
            )            
        )
    );
}
...