1

私はこれらのような複数のhabtmを持っています:

// ユーザー モデル
var $hasMany = array('Post');

// モデルを投稿
var $hasAndBelongsToMany = array('Category', 'Tag');

// カテゴリ モデル
var $hasAndBelongsToMany = array('Post');

// タグモデル
var $hasAndBelongsToMany = array('Post');

ユーザーとタグ(特定のカテゴリ内)とともにすべての投稿を取得しようとしましたが、タグを取得すると結果が間違っていました。

$this->paginate = array
(
    'Post' => array
    (
        'limit' => 2,

        'fields' => array(
            'Post.title', 'Post.content', 'Post.slug', 'Post.created',
            'Tag.name',
            'User.username', 'User.created', 'User.post_count', 'User.avatar_file_name'),

        'joins' => array
        (
            array(
                'table' => 'categories_posts',
                'alias' => 'CategoriesPost',
                'type' => 'inner',
                'conditions'=> array('CategoriesPost.post_id = Post.id')
            ),

            // FETCH USER
            array(
                'table' => 'users',
                'alias' => 'User',
                'type' => 'inner',
                'conditions'=> array('Post.user_id = User.id')
            ),

            // FETCH TAGS
            array(
                'table' => 'posts_tags',
                'alias' => 'PostsTag',
                'type' => 'inner',
                'conditions'=> array('PostsTag.post_id = Post.id')
            ),

            array(
                'table' => 'tags',
                'alias' => 'Tag',
                'type' => 'inner',
                'conditions'=> array('Tag.id = PostsTag.tag_id')
            ),

            array(
                'table' => 'categories',
                'alias' => 'Category',
                'type' => 'inner',
                'conditions'=> array('Category.id = CategoriesPost.category_id', 'Category.slug' => $slug)
            )
        )
    )
);

$posts = $this->paginate();

私は初心者なので、誰かが解決策を教えてもらえますか?どうもありがとう...

4

1 に答える 1

1

関連モデルを使用して結果セットをページ分割しようとすると、同様の問題が発生しました。Cake に適切なデータを一緒に含めるために、モデルを手動でバインドし、クエリを実行し、バインドを解除する必要がありました。( http://book.cakephp.org/view/86/Creating-and-Destroying-Associations-on-the-Fly )

また、結果セットに含めたいモデルを指定できる包含可能な動作を試すこともできます。Containable は 1.2+ ( http://book.cakephp.org/view/474/Containable ) のコアです。それ以外の場合は、自分で取得する必要があります。

なぜそんなに巨大なクエリがあるのか​​ についてはよくわかりません。私は次のようなことをしたいと思っています。

$this->Model->recursive = 2;
$this->Model->paginate();

そして、関連するすべてのデータを Cake にアソシエーションを通じて取得させます。次に、条件配列 ( http://api.cakephp.org/class/controller#method-Controllerpaginate ) を使用して戻り値を調整し、カテゴリを指定します。

申し訳ありませんが、それは事実上の解決策ではありませんが、私は CakePHP のアマチュアです! DebugKit ( http://github.com/cakephp/debug_kit ) を使用すると、クエリや結果などを簡単に表示できる場合があります。

于 2010-03-16T10:49:06.767 に答える