请求将指定SQL查询转换为Laravel关联Eloquent查询
转换为Eloquent关联查询的实现方案
首先确保你的模型已建立正确的关联关系:
定义模型关联
- 在
Review模型中添加关联:
public function excursion() { return $this->belongsTo(Excursion::class); }
- 在
Excursion模型中添加关联:
public function reviews() { return $this->hasMany(Review::class); }
方案1:对应原SQL逻辑的Eloquent写法
Review::select( DB::raw('ROUND(AVG(rating), 2) as avg_rating'), DB::raw('COUNT(excursions.id) as review_total'), 'excursions.name' ) ->leftJoin('excursions', 'reviews.excursion_id', '=', 'excursions.id') ->groupBy('reviews.excursion_id', 'excursions.name') ->get();
注意:原SQL里的
rating.reviews应为笔误,实际应该是reviews.rating;另外严格SQL模式下,groupBy需要包含所有非聚合字段,所以要加上excursions.name。
方案2:更贴合Eloquent风格的写法
利用模型关联的特性实现,代码更简洁:
Excursion::withCount('reviews') ->selectSub(function ($query) { $query->from('reviews') ->whereColumn('reviews.excursion_id', 'excursions.id') ->selectRaw('ROUND(AVG(rating), 2)'); }, 'avg_rating') ->select('name', 'reviews_count as review_total', 'avg_rating') ->get();
你原有DB门面代码的问题修正
你之前的代码里DB::raw给函数名加了多余的单引号('round'、'COUNT'),这会导致SQL语法错误,正确写法要去掉这些单引号,同时补充excursions.name到groupBy中:
DB::table('reviews') ->select( DB::raw('ROUND(AVG(rating), 2) as avg_rating'), DB::raw('COUNT(excursions.id) as review_total'), 'excursions.name' ) ->leftJoin('excursions','reviews.excursion_id','=','excursions.id') ->groupBy('reviews.excursion_id', 'excursions.name') ->get();
内容的提问来源于stack exchange,提问作者thes10
相关产品推荐
相关产品推荐

