在hasMany绑定中对子行进行排序

时间:2014-02-20 10:05:18

标签: cakephp

我有以下结构:

Category hasMany CategoryDynamic

当我使用Containable行为时,我希望获得CategoryDynamic字段排序的CategoryDynamic.language数据。例如,而不是默认结构:

array(
    'Category' => array(
        // ...
    ),
    'CategoryDynamic' => array(
        '0' => array(
            // ...
        ),
        '1' => array(
            // ...
        ),
    ),
);

我希望按CategoryDynamic.language字段排序:

array(
    'Category' => array(
        // ...
    ),
    'CategoryDynamic' => array(
        'eng' => array(
            // ...
        ),
        'fra' => array(
            // ...
        ),
    ),
);

CakePHP可以默认执行此操作,还是需要修改afterFind函数中的结果?

1 个答案:

答案 0 :(得分:1)

如果使用contains,Cakephp会执行此类解决方案。

它可以对'hasMany'关系中的数据进行排序,但不会按照您编写的方式返回。

CategroyModel:

class CategroyModel extends Model {
  public $actsAs = array('Containable');
  public $hasMany = array('CategoryDynamic');

  public function getData(){
    $conditions['contain'] = array(
        'CategoryDynamic' => array(
            'order' => 'CategoryDynamic.language ASC'
        )
    );
    return $this->find('first', $conditions);
  }
}

CategoryDynamicModel:

class CategoryDynamicModel extends Model {
  public $actsAs = array('Containable');
  public $belongsTo = array('Categroy'); 
}

然后当你打电话

$this->Categroy->getData();

在控制器中,它将给出SortDynamic:

array(
    'Category' => array(
        // ...
    ),
    'CategoryDynamic' => array(
        0 => array(
            language => 'eng'
            // ...
        ),
        1 => array(
            language => 'fra'
            // ...
        ),
        ...
    ),
);

我无法运行并检查上面发布的确切代码,因为我没有项目或架构,但我在项目中做了类似的事情并且已经有效。