Cakephp3可包含数据之和

时间:2018-07-16 23:55:44

标签: cakephp containable

我有文章模型和评分模型。一篇文章有​​很多评级。我想在过去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多个文章,而且我不想通过将不包括在内的文章的总得分加总而增加开销,因为它们太旧了。

1 个答案:

答案 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'));