Laravel – нетерпеливая загрузка метода (а не отношения) модели Eloquent

Подобно тому, как мы можем загружать отношения модели Eloquent, существует ли способ загрузить метод, который не является методом отношений модели Eloquent?

Например, у меня есть модель Eloquent GradeReport и она имеет следующий метод:

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

Теперь я получаю коллекцию моделей GradeReport Eloquent.

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

Как я могу загрузить возвращаемые значения метода totalScore для всех моделей GradeReport Eloquent в коллекции?

Вы можете добавить произвольные свойства к вашим моделям, добавив их в массив $ appends и предоставляя getter. В вашем случае следующее должно сделать трюк:

 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.

Таблица grade_report_scores также будет иметь красноречивую модель xyz, на которой вы определяете отношения, области запросов, функции и т. Д.

Добавить отношения в модель GradeReport:

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

Теперь вы можете переписать свою функцию totalScore следующим образом:

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

не проверено, обратите внимание на закрытие, вам нужно вызвать $query->select('id', 'srore', 'other used values');