You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求将指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 15:12:53