2016-09-04 11 views
2

Eloquentモデルの関係を熱望するように、Eloquentモデルの関係メソッドではないメソッドを熱心にロードする方法はありますか?例えばLaravel - Eagerモデルのメソッド(関係ではない)をロードする

、私は雄弁モデルGradeReportを持っており、それは次のような方法があります。

public function totalScore() 
{ 
    return $scores = DB::table('grade_report_scores')->where('grade_report_id', $this->id)->sum('score'); 
} 

は、今私はGradeReport雄弁モデルのコレクションを取得しています。

$gradeReports = GradeReport::where('student_id', $studentId)->get(); 

どのように熱心な負荷コレクションのすべてのGradeReport雄弁のモデルのtotalScore方法の戻り値はできますか?

答えて

3

モデルに任意のプロパティを追加するには、$ appends配列に追加し、ゲッターを指定します。あなたのケースではトリックを行う必要があり、次の

class GradeReport extends Model { 
    protected $appends = ['totalScore']; 

    public function getTotalScoreAttribute() { 
    return $scores = DB::table('grade_report_scores')->where('grade_report_id', $this->id)->sum('score'); 
    } 
} 

は今、すべてのGradeReportオブジェクトがtotalScore属性が設定されていますあなたのコントローラから返されました。

public function scores() 
{ 
    return $this->hasMany('xyz', 'grade_report_id', 'id'); 
} 

を今、あなたはすることができます

+1

を呼び出す必要があり、このモデルの属性にアクセスするたびに、DBへの呼び出しが – animaacija

+0

作られてこれは動作します私が意図した通りです。しかし、私は属性がより見栄えが良いように少し変更したいと思います。 'protected $ appends = ['total_score'];'。 – Debiprasad

+0

@animaacijaそれは熱心に読み込まれないかもしれませんが、必要に応じて動作します。この場合、熱心な負荷には対応できないと思います。 – Debiprasad

0

テーブルgrade_report_scoresXYZは、どのユーザーが定義雄弁モデルの関係、クエリスコープ、関数など

GradeReportモデルに関係を追加する必要がありますtotalScore関数を次のように書き直してください。

public function totalScores() 
{ 
    return $this->with(['scores' => function ($query) { 
     $query->sum('score'); 
    }])->get(); 
} 

閉鎖を注意し、テストしていない、湾曲部は、それが問題を解決する可能性がありますが、それは積極的なロードではありません$query->select('id', 'srore', 'other used values');

関連する問題