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

How get sum of field in the related table in one query in 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;

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

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

您正在查找的是统计查询。您可以为计数定义一个新关系,例如

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