0

私は次の関係を持っています:

投稿には多くのコメントがあります

投稿の所属カテゴリ

HABTM タグを投稿する

これらのプロパティで paginate メソッドを使用したい:

public $paginate = array(
    'published',
    'limit' => 3,
    'fields' => array(
        'Post.title',
        'Post.date_published',
        'Post.abstract',
        'Post.slug',
        'Category.value',
        'Category.slug'
    )
);

'published' はカスタマイズされた検索クエリですが、ここでは問題になりません。投稿とそのカテゴリに関する情報 (上記を参照) に加えて、投稿のコメント数とすべてのタグの名前を取得したいと考えています。つまり、$data['Post']['comment_count'] や $data['Post']['Tag'][0] などの便利な方法でビュー側のデータにアクセスできるようにしたいと考えています。 ['名前']。

十分にエレガントなこれに対する解決策はありますか? HABTM が少し複雑かもしれないことは知っていますが、同じクエリでコメントをフェッチする方法さえわかりません。ありがとうございました。

4

1 に答える 1

0

コメントモデルでcounterCacheパラメーターを次のように使用することがわかりました

public $belongsTo = array('Post' => array('counterCache' => true));

投稿テーブルにcomments_countフィールドを追加するのが、投稿のコメント数を取得するための最も簡単なソリューションです。これにより、新しいコメントが追加または削除されるたびにテーブルが更新されます。

タグに関しては、contain配列を使用していますが、paginateにも使用できます。私はそれを次のように使用します:

$this -> paginate = array(
        'published',
        'limit' => 3,
        'contain' => array(
            'Category',
            'Tag' => array('fields' => array(
                    'value',
                    'slug'
                ))
        ),
        'fields' => array(
            'Post.title',
            'Post.date_published',
            'Post.abstract',
            'Post.slug',
            'Post.comment_count',
            'Category.value',
            'Category.slug'
        ),
        'conditions' => $conditions,
        'joins' => $joins
    );

このようにすると、すべてのPostリクエストで、カテゴリと、タグモデルのフィールド値とスラッグのみがフェッチされます。

特定のタグを持つすべての投稿を取得したい場合は、特別な場合があります。これはHABTMの関係であることを忘れないでください。GeoffGarbersによるこの便利なモデルメソッドに出くわしました

これをAppModelに追加すると、hasAndBelongsToManyを呼び出すことができ、paginateメソッドの結合を定義する面倒なプロセスが自動化されます。上記のように、これらは$joins配列を介して追加されます。この配列は上記のメソッドで次のように生成されます。

$joins = $this -> Post -> generateHabtmJoin('Tag');

これで、次のような条件を簡単に定義できます。

$conditions = array('Tag.slug' => $this -> request -> params['tag']);

これは、特定のTag.slugを持つ投稿のみをフェッチします。

これが誰かに役立つことを願っています。

于 2012-06-26T11:28:36.317 に答える