2015-02-07 96 views
3

大家, 我有2个表,经三分之一相关: 结构如下所示:如何在一个查询中Yii2得到场的总和与相关表格

Playlist: id, channel_id, name, date 
Files: id, name, duration 
Playlist-rel-Files: list_id, file_id 

我在使用ActiveRecord我应用程序。当我使用这样的查询来获得最后的播放列表:

$pl = Playlist::find() 
       ->where(['channel_id' => $model->channel_id]) 
       ->orderBy(['date' => SORT_DESC]) 
       ->limit(1) 
       ->one(); 

然后我用这样的代码来获取所有的文件,这与去年的播放列表相关:

$f = $pl->files; 

一切正常,我也得到文件数组,但我不需要它们的列表,我只需要SUM的文件持续时间,要得到这个SUM,我将需要在foreach中运行数组,我的问题是:

我该如何修改我的第一个查询在一个查询中获取播放列表数据和此播放列表文件的持续时间总和?可能吗 ?

回答

7

你在找什么是一个统计查询。您可以为您的计数e.g

public function getFileCount() { 
    return $this->hasMany(Files::className(), ['id' => 'file_id']) 
       ->viaTable('playlist-rel-files', ['playlist_id' => 'id']) 
       ->sum('duration'); 
} 

这是然后用魔法属性$fileCount访问,并可以通过with被添加到查询预先加载即一种新的关系:

$pl = Playlist::find() 
      ->with('fileCount') 
      ->where(['channel_id' => $model->channel_id]) 
      ->orderBy(['date' => SORT_DESC]) 
      ->one(); 
相关问题