Так что у меня этот милый маленький индекс функции в моем ItemsController:Сортировка в контроллере, прежде чем постраничной() в CakePHP
public function index() {
$this->Item->recursive = 2;
$this->set('items', $this->paginate());
}
Это так, потому что я делаю кучу вычислений на afterFind (добавление поля, и сортировка по ним)
Но я хочу сортировать на уровне Контроллера, чтобы иметь возможность иметь недавний() и т. д. Если я сортирую на уровне afterFind, он будет сортироваться так каждый раз, независимо от того, контроллер - так что это не хорошо.
Как я могу сортировать на уровне контроллера и по-прежнему правильно использовать $ this-> paginate()?
FYI Вот некоторые из моих AfterFind:
public function afterFind($results, $primary = false){
parent::afterFind($results, $primary);
foreach ($results as $key => $val) {
// my foreach logic calculating Item.score
}
// the stuff I should be doing on a controller-to-controller basis:
$results = Set::sort($results, '{n}.Item.score', 'desc');
return $results;
}
Спасибо, я думаю, это то, что я ищу - за исключением того, что он не работает. Может быть, потому, что поле «оценка» не существует в db и просто вставляется в afterFind? – itamar
FYI проблема заключалась в том, что я не объявлял ее виртуальным полем. Как только я это сделал, я установил его в произвольное существующее поле, а затем вычислил его в afterFind. Меняем поля на то, что им нужно. Существует проблема лучшего, более низкого накладного способа сделать это. Но это сработало. – itamar
^Интересно, можете ли вы вычислить значение этого виртуального поля непосредственно в модели вместо afterFind()? Документация по виртуальным полям: http://book.cakephp.org/2.0/ru/models/virtual-fields.html –