Подобно тому, как мы можем загружать отношения модели 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');