2016-05-18 8 views
1

私はクラスGroupを持っていますが、それはたくさんあるTeamsであり、彼らのスコアで注文したいと思います。チームの得点はゲームを反復して計算されるので、スコアはdbフィールドではなく、仮想の読み取り専用属性です。Yii2:仮想属性で関係を並べる方法は?

これは私の試みです:

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

は、DB-フィールドではありませんスコアとしてこれは、動作しません。リレーションを仮想属性でどのように並べ替えることができますか?

+1

クエリでこのフィールドを使用する必要があるため、このフィールドをdbに追加することはできますか?私はそれが不可能だと思うので、ソートされていないデータを取得し、後でphpソート関数を使ってソートすることができます。 – StalkAlex

+0

関連モデルと検索モデルコード – scaisEdge

+1

パフォーマンスを考慮して、計算後にスコアをデータベースに保存する必要があります。チームの「afterSave()」メソッド、または他の必要な場所でスコアを計算することができます。 –

答えて

0

データベースビューを作成することができます。 team_score。ビューにはチームテーブルのすべてのフィールドと計算されたフィールドスコア(SQLコマンドで計算)が含まれている必要があります。その後、フィールドスコアで簡単に注文できるTeamScoreというモデルを作成することができます。

短所:計算された値がテーブルに直接格納されている場合よりも、計算されたビューを呼び出すたびに値が計算され、計算能力がさらに必要となります。

利点:実装が簡単で、最初に多くのリレーションを持つテーブルを表示すると、多くのコーディングが保存されます。

関連する問題