Я уверен, что это должно быть просто, но я не могу понять это. Это Laravel 5.4
У меня есть 3 модели, Профиль, Оценка и Ответы. Каждый профиль имеет много оценок, каждая оценка имеет много ответов.
Я хочу получить профили с последней оценкой, где общий балл равен 0;Я хотел бы предположить, что я могу каким-то образом использовать свои функции модели (latestAssessment () и total_points ()) в запросе Eloquent. Что-то вроде:
$noscore_profiles = \App\Profile::where('latestAssessment', function($query) {
$query->where(total_points(), '=', 0);
})->paginate(2, ['*'], 'noscore_profiles');
Я пробовал множество способов сделать это и просто не могу обдумать это.
ПРОФИЛЬ:
class Profile extends Model
{
protected $fillable = ['firstname', 'surname', 'gender', 'height', 'telephone', 'extension', 'start_date', 'yearly_reminder_sent'];
public function user() {
return $this->belongsto('App\User');
}
public function assessments() {
return $this->hasMany('App\Assessment');
}
public function latestAssessment() {
return $this->hasOne('App\Assessment')->latest();
}
public function responses() {
return $this->hasManyThrough('App\Response', 'App\Assessment');
}
public function total_points() {
$total_points = 0;
foreach($this->responses as $response) {
$total_points += $response->answer->points;
}
return $total_points;
}
}
ОЦЕНКА
class Assessment extends Model
{
protected $fillable = ['profile_id', 'start_date', 'completion_date', 'completion_status'];
public function profile()
{
return $this->belongsTo('App\Profile');
}
public function review()
{
return $this->hasOne('App\Review');
}
public function responses()
{
return $this->hasMany('App\Response');
}
public function equipment_requests()
{
return $this->hasMany('App\EquipmentRequests');
}
public function total_points() {
$total_points = 0;
foreach($this->responses as $response) {
$total_points += $response->answer->points;
}
return $total_points;
}
}
ОТВЕТИЛ - ФИНАЛЬНЫЙ КОД, КОТОРЫЙ РАБОТАЛ:
$noscore_profiles = \App\Profile::whereHas('latestAssessment', function($assessment) {
$assessment->select('assessments.id','assessments.profile_id')
->join('responses','responses.assessment_id', '=', 'assessments.id')
->join('answers', 'answers.id', '=', 'responses.answer_id')
->groupBy('assessments.id','assessments.profile_id')
->havingRaw('SUM(answers.points) = 0');
})->paginate(2, ['*'], 'noscore_profiles');