CakePHP 分页,如何按包含模型的计数排序?



使用 CakePHP 2.3,我使用分页器检索数据。所以,假设我的模型是拥有许多城市的国家,在我的国家控制器中,我有...

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

。这让我得到了所有县的列表,每行都包含任何人口稠密的城市的列表。

在我看来,我显然能够迭代foreach ($cities as $city)并回显$country['country_name']等,如果我希望我可以通过回声count($country['City'])来显示所包含城市的计数。

使用分页器,我可以通过在查询字符串中传回字段名称来对国家/地区结果进行排序,例如sort=country_name,但是如何让结果按所包含城市的计数进行排序?

不幸的是,使用自定义 Cakephp 分页无法按 hasMany 表的计数进行排序。最好的办法是按照文档中的说明使用counterCache

您需要在国家/地区表中有一个字段,名为city_count。每当对表进行保存操作时,Cakephp 将在国家/地区表中自动更新此字段city该字段。

由于您只想计算人口>100K的城市。您可以在counterScope中指定条件,该条件仅在满足条件时更新列。

这可以在您的城市模型中定义如下:

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

最新更新