2015-02-07 64 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(); 
相關問題