每个人, 我有2个表,通过第三个相关: 结构如下所示:
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中运行数组,我的问题是:
如何在一个查询中修改我的第一个查询以获取播放列表数据和此播放列表文件的持续时间总和?有可能吗?
答案 0 :(得分:7)
您要查找的是统计查询。您可以为您的计数定义新的关系,例如
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();