通过CakePHP中的belongsTo表指定order参数

时间:2009-09-29 00:20:05

标签: cakephp

假设我有两张桌子:citiescountriesCity模型belongsTo a Country。现在,当我显示城市列表时,我希望按国家名称和城市名称进行排序。

我在City模型类中尝试了这个:

var $order = array('Country.name' => 'asc', 'City.name' => 'asc');

排序顺序对我的索引页面正常工作,但是在我要求模型不加载关联模型的几个地方我遇到错误。当我更改加载哪些表时,是否必须更改订单参数,或者是否有更聪明的方法来执行此操作?

目前,我想我会将默认订单定义设为City.name,然后在索引页面上将其更改为Country.nameCity.name。这样,默认情况下它是安全的,我不应该出现意外错误。

更新:作为Rob suggested,您可以在模型关联中指定订单参数。查询构建器将如下应用它们:

  1. 如果主模型上有order字段,请先应用它。
  2. 按照出现的顺序浏览所有相关模型。如果关联包含order参数,请将其添加到列表的末尾。
  3. 为了实现我的例子,我会这样做:

    class City extends AppModel {
        var $belongsTo = array(
            'Country' => array(
                'order' => array('Country.name' => 'asc', 'City.name' => 'asc')));
    }
    

    一个警告:如果您关闭City.recursive,那么城市将会被排除。但是,当我关闭递归时,我通常只检索一条记录。

2 个答案:

答案 0 :(得分:2)

您是否尝试直接在关联中定义订单?我从来不需要这样做,所以我不能发誓它会做你想要的事情,但是:

class City extends AppModel {
    $belongsTo = array(
        'Country' => array(
            'Order' => 'Country.name'
        )
    );
} 

当然,您可以为Country模型执行类似操作。

答案 1 :(得分:0)

这是未经测试的,但这个想法是 在国家模型中你可以做到

hasMany = array('City');
function beforeFind()
{
    foreach($this->hasMany as $model)
    {
        $this->order[] = $model['className'].'.'.'ASC';
    }
}

不值得做IMO。你方式很好。