现在我开始熟悉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 ;
提前感谢您的回答。
抱歉我的英文
答案 0 :(得分:0)
在我看来,您的视频表中应该有一个平均评分字段。这样可以提高性能,让您轻松完成上述要求。
用户添加新评级后。使用以下公式重新计算字段:
new_avg_rating = (old_avg_rating + rating) / rating_count;
同样,如果用户删除评级:
new_avg_rating = (old_avg_rating - rating / rating_count;
“评级”是要添加或删除的评级,rating_count是该视频的“评级”表中的记录数。由于您在向表格添加/删除新评级后执行此操作,因此已包含新评级。