0

私は2つのテーブルを持っています:

出場者と投票出場者は多くの投票を持っています

count(Vote.id)を投票として実行してみたので、レコードセットに配置してページを移動するだけですが、どこに配置するかわかりません。私はfields配列でそれを行いましたが、所属する出場者に関係なく、投票の総数がわかりました。

投票は出場者のレコードセットで相互にリンクされているため、私が行ったのはカウント($ contestant [Vote])でしたが、これをページ分割することはできず、クライアントは出場者を投票で並べ替えることができるようにしたいと考えています。

私の見解でこのようなことをする方法はありますか?:

sort('Votes'、'count(Vote)'); ?>

または、Contestant.id = Votes.contestant_idであるすべての投票をカウントするクエリを作成する必要がありますか?

コントローラー出場者:

function index() {
            $page = 'Contestants';
            $this->set('page', $page);
            $this->paginate =
            array(
                    'order' => 'id ASC',
                    'contain' => array(
                            'Vote' => array(
                                    'fields' => array("Vote.contestant_id",'Vote.id')
                            )
                    )
            $conditions ["Contestant.active"] = 1;
            $this->set('contestants', $this->paginate('Contestant',

$ conditions)); }

4

4 に答える 4

0

追加:投票(総投票数)の昇順または降順で並べ替えますか?はいの場合、cakephpのデフォルトのページネーション方法では簡単に行うことはできません。

そのためには、少し調整する必要があります。このトリックの詳細は次のとおりです。CakePHPAdvancedPagination–派生フィールドで並べ替え

お役に立てば幸いです。

ありがとうアドナン

于 2010-01-25T11:20:22.900 に答える
0

この質問でのdecezeの応答をチェックしてください:CakePHP数学計算フィールド?

本質的にあなたは私が推測しているこのようなことをしたいです:

'contain' => array(
    'Vote' => array(
        'fields' => array('SUM(Vote.id) AS Contestant__votes'),
        'group'  => array('Vote.contestant_id'),
    )
)
于 2009-10-21T07:41:06.917 に答える
0

定義した特定の関係については、counter-cachingによってニーズが十分に満たされます。

テーブルに新しいフィールドを定義する必要がありcontestantsます: vote_count。次に、Votes モデルで、$belongsTo定義を少し更新する必要があります。

class Votes extends AppModel
{
    var $belongsTo = array(
        'Contestant' => array( 'counterCache' => true )
    );
}

これで、投票レコードが保存vote_countされるたびに、親の競技者のフィールドが更新されます。Contestant.vote_countこれで、他の Contestant フィールドと同じように簡単に並べ替えることができます。

class ContestantsController extends AppController
{
    // Controller stuff that comes before...

    function index()
    {
        $this->paginate = array( 'Contestant' => array(
            'conditions' => array( 'Contestant.active' => 1 ),
            'order' => array( 'Contestant.vote_count' => 'DESC' ),
        ));

        $contestants = $this->paginate('Contestants');

        $this->set( compact('contestants'));
    }

    // Controller stuff that comes after...
}
于 2010-03-23T19:24:34.533 に答える
0

cakephp は包含可能な動作で group by をサポートしていないので、私は別のアプローチを試みました。代わりに、投票モデルの paginate var を作成します (これはすべて Contestants Controller で行われます)。

var $paginate = array(
    'Vote'=>array(
        'limit'=>5,
        'fields' => array(
        'Contestant.*, count(Vote.contestant_id) as Contestant_votes, Vote.id'
        ),
        'group' => array(
        'Vote.contestant_id'
        ),
        'order' => array(
        'Contestant_votes Desc'
        )
    ),
    'Contestant'=>array(
        'limit'=>5,
        'order' => array(
        'Contestant.id Desc'
        )
    )
);

そして今、コントローラーで次のことを行います。

function index() {
    $page = 'Contestants';
    $this->set('page', $page);  
    $conditions ["Contestant.active"] = 1;
    $this->set('contestants', $this->paginate($this->Contestant->Vote,$conditions));
}

現在、競技者は総投票数で並べ替えられていますが、Contestant_votes をページネーター変数として配置する方法はまだわかりません。これは、レコード セットではそれ自体の配列であり、ページネーションに使用されるモデル配列のいずれにも含まれていないためです。 .

Matt Huggins に感謝します。あなたのアプローチが、私をこのソリューションに導いたものでした。

于 2009-10-21T22:34:54.607 に答える