2

システム

  • CakePHP 2.x

データベース

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

モデル

Visit belongsTo House
House hasMany Visit

意見

  • 私はhouses/index.ctpと呼ばれるすべての家のビューを持っています。
  • 各家とそのIDと名前が一覧表示されます。
  • また、PaginatorHelperを使用して配列を並べ替えます。

問題

  • 彼らが最後に訪れた家ごとに見たいです。
  • これは、PaginatorHelperによってソート可能である必要があります

試行

  • virtualFieldsでできると思いましたが、失敗しました(常にすべての家の最大値を返します)。

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

  • Housesテーブルの新しい列に各最大訪問数を「キャッシュ」しようとしましたが、非常に汚れています。

助けてくれてありがとう。

4

2 に答える 2

2

このための仮想フィールドの宣言は難しい場合があるため、必要なときにいつでもその場で追加することをお勧めします。

したがって、HousesControllerのインデックスアクションは次のようになります。

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多くのケーキにしたことに注意してください。

それが役に立てば幸い。

于 2013-02-16T15:32:10.960 に答える
0

Containable動作 を使用する場合、これは非常に簡単です。

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

これはまだテストしていませんが、必要なものにかなり近いはずです。contain最後のx回の訪問のみが表示されるように、に制限を追加することをお勧めします。

于 2013-02-16T15:43:23.910 に答える