質問

テーブルが 2 つあります。

出場者と投票の出場者Hasmany票

私は投票としてカウント(投票)をしようとしたので、レコードセットに配置してパジネートするだけですが、どこに配置するかわかりません。私はフィールドアレイでそれをしましたが、それは彼らが属する出場者に関係なく、私に合計投票数を与えました。

投票は競技者のレコードセットでリンクされているので、私がしたことは私の見解で私がカウント($ ptistant [投票])をしたと考えていましたが、これは和らげることはできず、私のクライアントは票で出場者を並べ替えたいと思っています。

私のビューでこのようなことを行う方法はありますか?:

sort('投票数', 'カウント(投票)');?>

または、contrestant.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',

$条件));}

役に立ちましたか?

解決 2

CakePHPは収容可能行動にして、グループをサポートしていませんので、私は別のアプローチを試してみました。代わりに(これはすべて出場コントローラで行われている)投票モデル用のpaginate VARを作成します:

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を配置する方法を見つけ出すことはできませんが、今の出場者は、その合計投票集計されたものですページ付けに使用。

おかげでマット・ハギンズあなたのアプローチは、このソリューションに私を導いたものだった。

他のヒント

は、定義した特定の関係について、あなたのニーズは、<のhref =「http://book.cakephp.org/view/816/counterCache-Cache-your-count」のrel =「nofollowをnoreferrer」によく提供しています>カウンターキャッシングするます。

contestants

あなたはvote_countテーブル内の新しいフィールドを定義する必要があります。次に、あなたの投票モデルでは、あなたは少し$belongsTo定義を更新する必要があります:

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

は今、いつでも投票レコードが保存され、親出場者のvote_countフィールドが更新されます。今、あなたはできるだけでソートContestant.vote_countによってあなたが他の出場者のフィールドと同じように:

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...
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top