Cake PHP显示视频ORDER BY评级

时间:2011-08-01 21:26:56

标签: php sorting paginate cakephp

现在我开始熟悉Cake PHP。

以下是问题: 我有两张桌子。这两个模型看起来像这样:

class Video extends AppModel {
var $ name = 'Video';
var $ hasMany = array ('Rating' =>
array ('className' => 'Rating',
'foreignKey' => 'model_id'
'Conditions' => array ('Rating.model' => 'Video');
'dependent' => true,
'exclusive' => true
)
);
}


class Rating extends Model {
var $ name = 'Rating';

var $ validate = array ('user_id' => array ('rule' => array ('MaxLength', 36),
'required' => true);
'model_id' => array ('rule' => array ('MaxLength', 36),
'required' => true);
'model' => array ('rule' => 'alphanumeric',
'required' => true));
}

看起来有效的查询是:

$ this-> paginate = array (
'Video' => array (
'limit' => 15,
'page' => 1,
'order' => array (
'Video.id' => 'DESC')
)
);
$ this-> set ('videos', $ this-> paginate ("Video"));

我想按评分排序

我的桌子:

CREATE TABLE `ratings` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `user_id` char(36) NOT NULL default '',
  `model_id` char(36) NOT NULL default '',
  `model` varchar(100) NOT NULL default '',
  `rating` tinyint(2) unsigned NOT NULL default '0',
  `name` varchar(100) default '',
  `created` datetime default NULL,
  `modified` datetime default NULL,
  PRIMARY KEY  (`id`),
  KEY `rating` (`model_id`,`model`,`rating`,`name`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;

CREATE TABLE `videos` (
  `id` int(11) NOT NULL auto_increment,
  `link` varchar(200) NOT NULL,
  `date` datetime NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=61 ;

提前感谢您的回答。

抱歉我的英文

1 个答案:

答案 0 :(得分:0)

在我看来,您的视频表中应该有一个平均评分字段。这样可以提高性能,让您轻松完成上述要求。

用户添加新评级后。使用以下公式重新计算字段:

new_avg_rating = (old_avg_rating + rating) / rating_count;

同样,如果用户删除评级:

new_avg_rating = (old_avg_rating - rating / rating_count;

“评级”是要添加或删除的评级,rating_count是该视频的“评级”表中的记录数。由于您在向表格添加/删除新评级后执行此操作,因此已包含新评级。