2016-09-04 7 views
2

Как мы можем надеяться на загрузку отношения модели Eloquent, есть ли способ загрузить метод, который не является методом отношений модели Eloquent?Laravel - нетерпеливая загрузка метода (не отношения) модели Eloquent

К примеру, у меня есть модель Красноречивого 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(); 

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

ответ

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 атрибут.

+1

может решить эту проблему, но она не жадная загрузка, каждый раз, когда этот атрибут модели доступен, вызов к БД производится – animaacija

+0

это работает как я и предполагал. Тем не менее, я хотел бы иметь небольшое изменение, чтобы атрибут выглядел лучше. 'protected $ appends = ['total_score'];'. – Debiprasad

+0

@animaacija Возможно, он не загружается, но работает, как мне было нужно. Я думаю, что в этом случае невозможно зарядить загрузку. – Debiprasad

0

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

Добавить отношения в модель 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(); 
} 

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