Порядок по совокупной функции Laravel Eloquent - PullRequest
0 голосов
/ 15 октября 2018

Привет, мне было интересно, можно ли сгруппировать / отсортировать результаты запроса по агрегатным функциям (MAX, MIN, COUNT) с помощью Eloquent Laravel.Модели:

class School extends Model{
   function students(){
       return $this -> hasMany(Student::class);
   }
}
class Student extends Model{
   function school(){
       return $this -> belongsTo(School::class);
   }
}

Классические отношения один-ко-многим, и я хочу выполнить следующий запрос:

School::select('school.*', 'MAX(student.score) as best_score') -> join('student', 'student.school_id', '=', 'school.id') -> orderByDesc('best_score') -> toSql()

Поэтому я хочу перечислить все школы, в которых у ученика лучший результат.,Laravel Eloquent выполняет следующий запрос:

select `school`.*, `MAX(student`.`score)` as `best_score` from `serije` inner join `student` on `student`.`school_id` = `school`.`id` order by `best_score` desc

Таким образом, он отображает MAX(student в виде столбца и вызывает ошибку sql. Есть ли способ обойти этот без использованияколлекции , идея состоит в том, чтобы максимально использовать БД.

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Вы можете легко проверить это на модели школы.

public function students(){
   return $this->hasMany('App\Student','school_id','id')->orderByDesc('score');
}

Вызовите эту функцию на вашем контроллере с помощью («ученики»)

0 голосов
/ 15 октября 2018

Вы можете добавить пользовательский атрибут и сделать заказ для этого пользовательского атрибута:

class School extends Model
{
    public function students()
    {
       return $this->hasMany(Student::class);
    }

    public function getHighestScoreAttribute()
    {
        $student = $this->students()->orderBy('score')->first();

        return $student ? $student->score : 0; 
    }
}
class Student extends Model{
    public function school()
    {
       return $this->belongsTo(School::class);
    }
}

// Query
$schools = School::orderBy('highestScore')->all();
...