Запрос результата модельной функции в Laravel - PullRequest
0 голосов
/ 07 ноября 2019

Я уверен, что это должно быть просто, но я не могу понять это. Это 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');

1 Ответ

0 голосов
/ 07 ноября 2019

Вы не можете использовать total_points() в своем запросе, так как для этого нужен экземпляр, который нужно вызвать, и вам нужен результат запроса для экземпляра модели.

что вы можете сделать, это поставить логикув сам запрос

$noscore_profiles = \App\Profile::whereHas('latestAssessment', function($assessment) {
    $assessment->whereRaw('SUM(answers.points) = 0')
        ->join('responses','response.assessment_id', '=', 'assessments.id')
        ->join('answers', 'answers.response_id', '=', 'responses.if')
        ->groupBy('assessments.id','profile_id')
        ->select('assessments.id','assessments.profile_id');
})->paginate(2, ['*'], 'noscore_profiles');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...