Yii2:如何按虚拟属性排序关系?

Yii2: How to order a relation by virtual attribute?

我有一个 class Group,其中有许多 Teams,我想按分数排序。一个团队的得分是通过迭代其比赛来计算的,因此 score 不是数据库字段,它是一个虚拟的只读属性。

这是我的尝试:

public function getTeams()
{
    return $this->hasMany(Team::className(), ['group' => 'id'])->orderBy(['score' => SORT_ASC]);
}

这不起作用,因为 score 不是数据库字段。如何通过虚拟属性对关系进行排序?

您可以创建数据库视图,例如team_score。该视图应包含团队 table 的所有字段和计算的字段分数(使用 SQL 命令计算)。然后你可以创建一个模型 TeamScore,你可以很容易地按字段分数排序。

缺点:这些值将通过每次调用新视图计算,与计算值直接存储在 table 中相比,需要更多的计算能力。

优点:实现简单,首先显示table有很多关系,节省了大量编码。