hasMany 関連付けを使用したページネーション CakePHP
-
22-09-2019 - |
質問
テーブルが 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
私は別のアプローチを試してみました。代わりに(これはすべて出場コントローラで行われている)投票モデル用の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を配置する方法を見つけ出すことはできませんが、今の出場者は、その合計投票集計されたものですページ付けに使用。
おかげでマット・ハギンズあなたのアプローチは、このソリューションに私を導いたものだった。
他のヒント
この問題のdecezeの応答をチェックしてください: CakePHPの数学・計算フィールド
基本的に私は推測しているこのような何かをしたいです
'contain' => array(
'Vote' => array(
'fields' => array('SUM(Vote.id) AS Contestant__votes'),
'group' => array('Vote.contestant_id'),
)
)
追加:また、投票数 (総投票数) を昇順または降順で並べ替えますか?「はい」の場合、cakephp のデフォルトのページネーション方法では簡単にページネーションを行うことはできません。
そのためには、少し調整する必要があります。このトリックの詳細は次のとおりです。 CakePHP の高度なページネーション – 派生フィールドによる並べ替え
お役に立てば幸いです。
アドナンに感謝します
は、定義した特定の関係について、あなたのニーズは、<の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...
}