📜  avg rating get in join in laravel 8 - PHP (1)

📅  最后修改于: 2023-12-03 14:59:25.785000             🧑  作者: Mango

Laravel 8 中通过 JOIN 获取平均评分

在 Laravel 8 中,我们可以使用 JOIN 连接多张表格获取数据,并通过 Aggregation 函数计算出平均评分。下面将介绍如何在 Laravel 8 中使用 JOIN 和 Aggregation 函数从多张表格中获取平均评分。

1. 数据表结构

我们准备使用三张表格来模拟数据。分别是用户表格(users)、商品表格(products)和评分表格(ratings)。表格结构如下所示:

用户表格(users)

| id | name | |----|----------| | 1 | Alice | | 2 | Bob | | 3 | Charlie |

商品表格(products)

| id | name | |----|----------| | 1 | iPhone | | 2 | MacBook | | 3 | Watch |

评分表格(ratings)

| id | user_id | product_id | rating | |----|---------|------------|--------| | 1 | 1 | 1 | 5 | | 2 | 1 | 3 | 4 | | 3 | 2 | 1 | 3 | | 4 | 2 | 3 | 4 | | 5 | 3 | 1 | 4 | | 6 | 3 | 2 | 5 |

2. 模型关联

我们需要在用户模型(User)、商品模型(Product)和评分模型(Rating)之间建立关联。找出每个商品的评分,并计算出平均评分。在商品模型中定义 belongsToMany 关联:

class Product extends Model
{
    public function ratings()
    {
        return $this->belongsToMany(Rating::class);
    }
}

在评分模型中定义 belongsTo 关联:

class Rating extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }

    public function product()
    {
        return $this->belongsTo(Product::class);
    }
}
3. 控制器方法

我们需要在控制器中编写一个方法,用于获取商品平均评分。该方法包含了 JOIN 和 Aggregation 函数。在控制器中定义如下方法:

use Illuminate\Support\Facades\DB;

public function averageRating()
{
    return DB::table('products')
        ->join('product_rating', 'products.id', '=', 'product_rating.product_id')
        ->select('products.name', DB::raw('AVG(product_rating.rating) as rating_avg'))
        ->groupBy('products.name')
        ->get();
}
4. 路由定义

定义路由,触发控制器方法:

Route::get('/average-rating', [ProductController::class, 'averageRating']);
5. 返回值示例

接口返回结果应如下所示:

| name     | rating_avg |
|----------|------------|
| iPhone   | 4.0        |
| MacBook  | 5.0        |
| Watch    | 4.0        |
6. 结论

在 Laravel 8 中,我们可以使用 JOIN 和 Aggregation 函数来连接多张表格并计算出评分均值。通过模型关联我们可以更加方便地操作数据库,代码量也大大减少。希望本文提供了 Laraval 8 中 JOIN 和 Aggregation 函数的最佳实践。