2013-02-16 3 views
2

СистемаCakePHP 2.x - Виртуальные поля Макс элементы Foreach

  • CakePHP 2.x

База данных

Houses --> id, name 
Visits --> id, date, house_id 

Модели

Visit belongsTo House 
House hasMany Visit 

Посмотреть

  • У меня есть мнение для всех домов, называемых домов/index.ctp.
  • В нем перечислены каждый дом с идентификатором и их именем.
  • Я также использую PaginatorHelper для сортировки моего массива.

Выпуск

  • Я хотел бы видеть в каждом доме последнего визита они имели.
  • Это должны быть сортируется по PaginatorHelper

Пытается

  • Я думал, что я мог сделать это с virtualFields, но мне не удалось (она всегда возвращает максимальное значение всех домов) ,

    public $virtualFields = array('lastvisit' => 'SELECT MAX(visits.date) FROM visits, houses WHERE houses.id = visits.house_id GROUP BY house_id');

  • Я пытался «кэш» каждый макс визит в новой колонке Дома таблицы, но это очень грязно.

Благодарим за помощь.

+0

Что вы подразумеваете под 'but I failed?? Любые сообщения об ошибках? –

+0

Я просто редактирую вопрос, чтобы добавить виртуальное поле, которое я пробовал. – Starflash

+0

Интересная проблема – luchomolina

ответ

2

Объявление виртуального поля для этого может быть сложным, поэтому я предлагаю вам добавить его на лету, когда вам это нужно.

Так индекс действие ваших HousesController «S будет выглядеть следующим образом:

public function index() { 
    $this->House->virtualFields['last_visit'] = 'MAX(Visit.date)'; 
    $this->paginate = array(
     'House' => array(
      'group' => array('house_id'), 
      'joins' => array(
       array(
        'table' => 'visits', 
        'alias' => 'Visit', 
        'type' => 'INNER', 
        'conditions' => array(
         'House.id = Visit.house_id', 
        ) 
       ) 
      ) 
     ) 
    ); 

    $this->set('houses', $this->paginate()); 
} 

Обратите внимание, вы должны удалить $publicFields декларации от вашей модели, и что я изменил название поля к от lastvisit к last_visit в сделайте его более торт.

Надеюсь, это поможет.

+0

Эй, похоже, приятно. Я проверяю и обратную связь. – Starflash

+0

То же самое, приятно перечислить последние посещения, но paginator не может сортировать по этим датам. – Starflash

+0

@Starflash, вы правы, я только что отредактировал код, теперь он чище и позволяет сортировать;) – luchomolina

0

Это довольно просто, если вы используете поведение Containable.

$this->paginate['House'] = array(
    'contain' => array('Visit' => array('order' => 'date DESC') 
); 
    $houses = $this->paginate('House'); 

Я еще не тестировал это, но он должен быть близок к тому, что вам нужно.Вы можете добавить ограничение на contain, чтобы вы видели только последние посещения x.

+0

@luchomolina, я посмотрел на ваше редактирование, но я не уверен, что вы правы. Посмотрите на следующий пример: http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html#using-containable-with-pagination –

+0

Это интересно, я отредактировал его на основе тестов, которые я Бег. У меня есть песочница для вопросов Stackoverflow: P и запуск вашего кода бросает это уведомление (а не ошибка, извините): «Косвенная модификация перегруженного свойства HousesController :: $ paginate не имеет никакого эффекта» - может быть, кто-то должен исправить пекарню? – luchomolina

+0

Ну, похоже, это интересный способ решить проблему. Я могу получить все данные, но, как сказал @luchomolina, он не сортирует этот столбец. – Starflash

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

  • Нет связанных вопросов^_^