如何在Yii2中的一个查询中获取相关表中的字段总和

时间:2015-02-07 12:38:13

标签: mysql activerecord yii2

每个人, 我有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中运行数组,我的问题是:

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

1 个答案:

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