2014-02-20 3 views
0

I имеет следующую структуру:Сортировка дочерних строк в hasMany связывание

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

Если вы хотите обновить структуру данных с помощью ключей 'eng',' fra', тогда ответ будет «нет», но если вы хотите только правильный порядок, тогда «да». Если вы предоставляете больше контекста, по крайней мере, фрагмент исходного кода, я думаю, что ответ может быть более подробным. – Vadim

+0

Ну, я не знаю, какой код предоставить ... Я могу объяснить немного больше, таблица 'CategoryDynamic' содержит все поля, которые изменяются между языками, а 'Category' содержит только данные древовидной структуры. Что вы подразумеваете под «правильным порядком»? –

ответ

1

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(); 

в контроллере, он даст отсортированный CategoryDynamic:

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

Я не могу запустить и проверить точный код, который я написал выше, так как у меня нет проекта или схемы, но я сделал что-то подобное в своем проекте, и он сработал.

+0

Хорошо, тогда я буду сортировать данные вручную в функции 'CategoryDynamic' afterFind(). –

+1

Это также одно из решений, но вы должны быть осторожны, чтобы сделать обычную сортировку в функции afterFind(). Потому что в другой ситуации вам может понадобиться сортировать CategoryDynamic по-другому (например, id ASC), а afterFind() предотвратит это. – kyo

Смежные вопросы