我正在使用CakePHP作为CMS / Web服务来支持iPhone应用程序。 我想知道如何通过“count”某些外部模型的数量对我的.find()方法进行排序?
例如:一个视频对象与投票相关联。 因此,对于单个Video行,有多个Vote行(具有user_id和video_id)。
$videos = $this->Video->find('list', array( <<orderby stuff>> ));
如何更改orderby子句以返回25个最受欢迎的视频,按投票排序?
我正在使用CakePHP作为CMS / Web服务来支持iPhone应用程序。 我想知道如何通过“count”某些外部模型的数量对我的.find()方法进行排序?
例如:一个视频对象与投票相关联。 因此,对于单个Video行,有多个Vote行(具有user_id和video_id)。
$videos = $this->Video->find('list', array( <<orderby stuff>> ));
如何更改orderby子句以返回25个最受欢迎的视频,按投票排序?
var $belongsTo = array('Video' => array('counterCache' =>true));
在你的视频表中创建vote_count字段
然后排序
$videos = $this->Video->find('list', array( 'order' => array('vote_count DESC'), 'limit'=>25 ))
video
表添加一个新列。因此,基于现有的架构和提出的问题,除非对架构进行修改,否则在尝试使用counterCache时将发生SQL错误。我知道这是一个技术性的问题。 - Chuck Burgessvote_count
这样的列。 - Adam Robinsonvote_count
没有被更新,会发生什么?它会立即(并永久地)变得无效。-1 - Ken White假设您有以下表:
CREATE TABLE `videos` (
`id` char(36) NOT NULL,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
)
CREATE TABLE `votes` (
`id` char(36) NOT NULL,
`video_id` char(36) NOT NULL,
`user_id` char(36) NOT NULL,
PRIMARY KEY (`id`)
);
SELECT
count(id),
video_id
FROM votes
GROUP BY video_id
ORDER BY count(id) DESC
LIMIT 25;
$this->Vote->recursive = 1;
$vote_info = $this->Vote->find('all',
array(
'fields' => array('count(Vote.id)','Video.name'),
'group' => array('video_id'),
'order' => array('count(Vote.id) DESC'),
'limit' => 25,
)
);
当您获取数据时,只要您的模型关系设置正确(递归选项设置为1),您还将获得视频信息。
例如,数据将类似于:
Array
(
[0] => Array
(
[0] => Array
(
[count(`Vote`.`id`)] => 3
)
[Video] => Array
(
[name] => Dumb and Dumber
)
)
[1] => Array
(
[0] => Array
(
[count(`Vote`.`id`)] => 1
)
[Video] => Array
(
[name] => Lord of the Rings
)
)
[2] => Array
(
[0] => Array
(
[count(`Vote`.`id`)] => 1
)
[Video] => Array
(
[name] => Just Do It
)
)
)
$this->Vote->recursive = 0;
$votes = $this->Vote->find('all',
array(
'fields' => array('count(Vote.id) as count', 'Vote.video_id'),
'order' => array('count(Vote.id) DESC'),
'group' => array('Vote.video_id'),
'limit' => 25,
)
);
这将返回:
Array
(
[0] => Array
(
[0] => Array
(
[count] => 3
)
[Vote] => Array
(
[video_id] => 4dac4de7-4f80-48c1-8a02-83b4dfa458e5
)
)
[1] => Array
(
[0] => Array
(
[count] => 1
)
[Vote] => Array
(
[video_id] => 4dac4ddc-712c-4795-8d9a-83b4dfa458e5
)
)
[2] => Array
(
[0] => Array
(
[count] => 1
)
[Vote] => Array
(
[video_id] => 4dac4df0-382c-4bb5-a5ee-83b4dfa458e5
)
)
)