我有文章模型和评分模型。一篇文章有很多评级。我想在过去60天内找到收视率最高的10条文章。我发现的问题是,我必须在可容纳的模型上获得sumOf'score'。
这是我尝试过的:
$articles = $this->Articles->find()
->where( 'Articles.publish >' => (new Time())->subDays(60))
->contain([
'Ratings' => function ($q) {
return $q->select(['id', 'article_id', 'total' => func()->sum('score')
]);
},
])
->order(['Ratings.total' => 'DESC']);
另一种方法是先查询“评分”,以将10个最高总分计入,然后在“文章”中加入。不过,这似乎效率不高,因为我有2500多个文章,而且我不想通过将不包括在内的文章的总得分加总而增加开销,因为它们太旧了。
答案 0 :(得分:0)
请使用左联接检查以下代码
$query = $this->Articles->find();
$query->limit( 10 );
$query->where( ['Articles.created >' => (new Time())->subDays(60)]);
$query->select( [
'Articles.id',
'Articles.title',
'sumrating' => $query->func()->sum( 'Ratings.rating' ),
'Articles.created',
'Articles.modified'
] );
$query->leftJoin(
[ 'Ratings' => 'ratings' ],
[ 'Ratings.article_id = Articles.id' ]
);
$query->group( [ 'Articles.id' ] );
$query->order( [ 'sumrating'=> 'DESC' ] );
$articles = $query ;
$this->set(compact('articles'));