0

我有两张桌子:

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

我已经尝试将 count(Vote.id) 作为 Votes 进行计数,这样我就可以将其放在记录集上并对其进行分页,但我不知道将其放在哪里。我是在 fields 数组上做的,但它给了我总票数,不管他们属于哪个参赛者。

投票在参赛者记录集中链接在一起,所以我所做的是在我看来我做了一个计数($contestant[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',

$条件)); }

4

4 回答 4

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

由于 cakephp 在可包含的行为中不支持 group by,我尝试了一种不同的方法。而是为投票模型创建分页变量(所有这些都在参赛者控制器中完成):

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 放置为分页器变量,因为在记录集中它在它自己的数组中,而不是在任何用于分页的模型数组中.

谢谢马特哈金斯你的方法是让我找到这个解决方案的方法。

于 2009-10-21T22:34:54.607 回答
0

加法:您还想按Votes(总票数)升序还是降序排序?如果是的话,你用 cakephp 的默认分页方式是不容易做到的。

为此,您需要稍作调整。这是有关此技巧的详细信息:CakePHP 高级分页 – 按派生字段排序

希望对您有所帮助。

谢谢阿德南

于 2010-01-25T11:20:22.900 回答
0

对于您定义的特定关系,反缓存可以很好地满足您的需求。

您将需要在contestants表中定义一个新字段:vote_count. 然后,在您的 Votes 模型中,您需要$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...
}
于 2010-03-23T19:24:34.533 回答