【问题标题】:Order By Aggregate Function Laravel Eloquent按聚合函数排序 Laravel Eloquent
【发布时间】:2018-10-15 19:43:24
【问题描述】:

您好,我想知道是否可以使用 Laravel 的 Eloquent 通过聚合函数(MAX、MIN、COUNT)对查询结果进行分组/排序。这些模型是:

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 错误,有没有办法绕过这个不使用集合,想法是使大部分 DB。

【问题讨论】:

    标签: php mysql laravel eloquent object-relational-model


    【解决方案1】:

    您可以添加一个自定义属性,并对这个自定义属性执行 orderBy:

    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();
    

    【讨论】:

    • 好主意,但它会为每个 School 实例调用查询吗?
    • 是的,您可以使用预加载。
    【解决方案2】:

    您可以在 School 模型上轻松查看此内容。

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

    用('students') 在你的控制器上调用这个函数

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-07
      • 2021-01-25
      • 2017-10-18
      • 2019-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-16
      相关资源
      最近更新 更多