2013-10-01 66 views
0

我有這樣一個模型關係:CakePHP的分頁用的hasMany通過關係

Person belongsTo Counselor, PersonType, Program, Term 
Person hasMany PersonStage, Text, Mail 
PersonStage belongsTo Person, Stage 
Stage hasMany PersonStage 

從本質上講,我創建了一個多到多階段和人之間的關係,但PeronStage表(people_stages)有一些額外的信息,最重要的是一個created字段。

什麼,我試圖做的是找到和分頁的結果,往往是根據人的當前 PersonStage,這將永遠是最新的(一個MAX(people_stages.created)

我不知道如何做到這在Cake中。我知道在SQL中,連接查詢如下,但我不知道如何在Cake中複製它。

SELECT * 
FROM  people AS p LEFT JOIN (people_stages AS s NATURAL JOIN (
      SELECT person_id, MAX(created) created 
      FROM  people_stages 
      GROUP BY person_id 
     ) t) ON s.person_id = p.id 
ORDER BY p.last_name 

我試過各種連接,都無濟於事。這裏是我的代碼,而這些連接:你應遵循

$this->Paginator->settings = array(
    'recursive' => -1, 
    'contain' => array('Counselor','Term','Program','PersonType'), 
    'fields' => array('Person.*', 'Counselor.id', 'Counselor.first_name', 'Counselor.last_name', 'Term.*', 'Program.*', 'PersonType.*'), 
    'order' => array('Person.counselor_read' => 'asc', 'PersonStage.create' => 'desc'), 
    'limit' => 25 
); 
$people = $this->Paginator->paginate('Person'); 

回答

0

之前獲得的分頁結果這樣

一些標準在控制器聲明$paginate變量即PeopleController

public $paginate = array(
    'limit' => 10, // you can set how much you want 
    'order' => 'People.last_name' 
); 

,然後在PeopleController您想要對結果進行分頁的操作只需設置條件以您想要的方式獲取數據,

public function your_action_name() { 
    $this->paginate['contain'] = array('PersonStage'); 
    $this->Person->Behaviors->load('Containable'); 
    $people = $this->paginate(); 
} 

希望這可以幫助你。

+0

謝謝。我需要將分頁設置保留在方法內部,因爲它們與管理方面不同 - 與公共方面有不同的要求。分頁正在工作,這只是我無法弄清楚的連接。 – Pete

+0

您對模型使用可容忍的行爲嗎?如果沒有在你的行動中加載它,你可以通過 '$ this-> Person-> Behaviors-> load('Containable');' –

+0

是的,絕對使用Containable。問題是,我想選擇最近的階段,而不是用戶曾經擁有過的所有階段。 – Pete