与hasMany协会cakePHP分页

时间:2009-10-21 07:32:44

标签: sql cakephp pagination has-many belongs-to

我有两张桌子:

参赛者和投票 参赛者有很多投票

我已经尝试将一个计数(Vote.id)作为投票,所以我可以把它放在 记录集,只是将它们分页,但我不知道在哪里放置它。 我是在田野阵列上做到的,但它给了我总票数 无论他们属于哪个参赛者。

投票在参赛者记录集中链接在一起,所以我 在我看来我做了一个计数($选手[投票]),但这不可能 分页,我的客户希望能够对参赛者进行排序 票。

我的观点是否可以做到这样的事情?:

排序('投票','计数(投票)'); ?>

或者我是否必须创建一个对所有投票进行计数的查询 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',

$条件));         }

4 个答案:

答案 0 :(得分:0)

在此问题中查看deceze的回复:CakePHP mathematic-calculation field?

基本上你想做这样的事我猜:

'contain' => array(
    'Vote' => array(
        'fields' => array('SUM(Vote.id) AS Contestant__votes'),
        'group'  => array('Vote.contestant_id'),
    )
)

答案 1 :(得分:0)

由于cakephp不支持group by in containable行为,我尝试了另一种方法。改为为投票模型创建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作为paginator变量放置,因为在记录集中它是在它自己的数组中而不是在任何模型数组中用于分页。

感谢Matt Huggins,你的方法就是让我解决这个问题的方法。

答案 2 :(得分:0)

另外:你还想按投票(总票数)升序或降序排序吗?如果是,则不能通过cakephp的默认分页方法轻松完成。

为此你需要一点点调整。以下是有关此技巧的详细信息:CakePHP Advanced Pagination – sort by derived field

希望你会发现它有用。

由于 阿德南

答案 3 :(得分:0)

对于您定义的具体关系,counter-caching可以很好地满足您的需求。

您需要在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...
}