0

私はこのようなモデル関係を持っています:

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

基本的に、stage と person の間に多対多の関係を作成しましたが、PeronStage テーブル(people_stages)にはいくつかの追加情報、最も重要なcreatedフィールドがあります。

私がやろうとしているのは、多くの場合、Person の現在の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');
4

1 に答える 1

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

これがお役に立てば幸いです。

于 2013-10-01T05:04:15.433 に答える