0

私は ArticlesController で、記事数 DESC でソートされたトップ記事ポスターのリストを表示しようとしています。テーブルには、ユーザーが持っているポイントの合計数 (順序なし) も表示する必要があります。記事の総数またはポイントの合計を単独で計算すると、正常に機能しますが、両方の数を同時に計算しようとすると、それぞれの値が正しく返されません。たとえば、ユーザーが記事テーブルに 5 つのレコードを持ち、ポイント テーブルに 10 レコードを持っている場合 (合計で 50 ポイント、それぞれ 5 ポイントとしましょう)、ユーザーは 50 個の記事と 250 ポイントを持っていると出力されます。

$this->paginate = array(
    'fields' => array(
        'User.username', 'User.online',
    ),
    'conditions'    => array(
        'Article.page_id'  => $page_id,
        'Article.status_id BETWEEN ? AND ?' => array(2,6),
        'Point.page_id'  => $page_id,
    ),
    'link'  => array(
        'Article' => array(
            'fields' => array(
                'Article.id', 'COUNT(Article.id) AS articles'
            )
       ),
       'Point' => array(
            'fields' => array(
                'Point.id', 'SUM(Point.amount) AS page_points'
             )
        ),
    ),
    'group' => 'User.id',
    'order' => 'articles DESC, User.username ASC',
    'limit' => 35,
    'contain' => array(
        'Avatar' => array(
            'fields' => array(
                'Avatar.file'
             )
        ),
    ) // contain
);

$this->set('users', $this->paginate('User'));
4

1 に答える 1

1

問題は、Linkable ビヘイビアーを使用する複数の計算フィールドで、計算が歪められる結果となります。返される数値は、リンクされた各モデルの行数で乗算されます。

以下は実際に私が望むことを達成しますが、ページネーションの並べ替えで機能するため、さらに優れています。

$this->User->virtualFields['page_points'] = "(select SUM(amount)
    from points as Point 
    where Point.user_id = User.id
    AND Point.page_id = $page_id
)";

$this->User->virtualFields['page_articles'] = "(select COUNT(Post.id)
    from posts as Post
    where Post.user_id = User.id
    AND Post.page_id = $page_id
    AND Post.status_id BETWEEN 2 AND 6
    AND Post.module_id = $module_id
)";

$this->paginate = array(
    'fields' => array(
        'User.id', 'User.username', 'User.online', 'User.points', 'User.page_points', 'User.page_articles'
    ),
    'link'  => array(
        'Post' => array(
            'fields' => array(
                'Post.id'
            ),
        ),
    ),
    'group' => 'User.id',
    'order' => 'User.page_articles DESC, User.username ASC',
    'limit' => 10,
    'contain' => array(
        'Avatar' => array(
            'fields' => array(
                'Avatar.file'
            ) // avatar fields
        ), // avatar
    ) // contain
); // paginate

$this->set('users', $this->paginate('User'));

どうやら、まだ Post モデルにリンクしていないと機能しません。したがって、Post モデルにリンクして、1 つの ID を取得するだけです。クエリの速度は問題ではないようです。リンク可能内の投稿をカウントできません。そうしないと、ページネーターの並べ替えで結果を使用できません。

于 2013-05-14T19:49:49.987 に答える