mysql - Laravel 使用带外键的 avg() 函数

标签 mysql laravel eloquent laravel-5.8

我想获得每种产品的平均费率。

我有一个 rates 表,它有一个指向 product 表的外键, rates 表与此类似

a busy cat

当我尝试使用此代码获取产品时:

$stocks = Stocks::with('images:url,color', 'tags:tag', 'sizes', 'rates')
                ->get()
                ->pluckDistant('tags', 'tag')
                ->pluckDistant('sizes', 'size');

它返回这个

[
    {
        "id": 10,
        "name": "name",
        "image": "1564964985mI7jTuQEZxD49SGTce6Qntl7U8QDnc8uhVxedyYN.jpeg",
        "images": [
            {
                "url": "1564964985mI7jTuQEZxD49SGTce6Qntl7U8QDnc8uhVxedyYN.jpeg",
                "color": ""
            },
            {
                "url": "1564964985EV20c1jGvCVCzpCv2Gy9r5TnWM0hMpCBsiRbe8pI.png",
                "color": ""
            },
            {
                "url": "1564964985iFcMox6rjsUaM8CHil5oQ9HkrsDqTrqLNY1cXCRX.png",
                "color": ""
            }
        ],
        "tags": [
            "عطور"
        ],
        "sizes": [],
        "rates": [
            {
                "id": 1,
                "stocks_id": 10,
                "rate": 2
            },
            {
                "id": 2,
                "stocks_id": 10,
                "rate": 4
            }
        ],
    }
]

如何在没有 php 处理的情况下使用 Eloquent 关系通过 sql 获取所有费率 "rates":3 的平均费率?

最佳答案

你可以利用像 Appending 这样的东西.假设您有一个 Product 模型,它与 Rate 模型具有 OneToMany 关系。

您的 Product 模型看起来像这样:

class Product extends Model
{
    protected $with = ['rates'];


    protected $appends = ['average_rate'];


    public function getAverageRateAttribute()
    {
        return $this->attributes['average_rate'] = $this->rates->avg('rate');
    }

    public function rates() {
        return $this->hasMany(Rate::class);
    }
}

现在,无论何时您从数据库中查询产品,结果都会附加费率。

array:7 [▼
  "id" => 1
  "created_at" => "2019-08-12 14:08:09"
  "updated_at" => "2019-08-12 14:08:09"
  "average_rate" => 4.5
  "rates" => array:2 [▶]
] 

但是,请注意导致 n+1 问题。如果您使用这种方法,请确保始终预先加载您的费率

关于mysql - Laravel 使用带外键的 avg() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57461555/

相关文章:

php - 用多个select语句查询并加入Eloquent

javascript - Laravel Mix (webpack) Inline JS undefined jQuery/vendor

laravel - Laravel5软删除时如何将相关表记录设置为Null

php - Laravel 中的一对一关系总是需要 first() 吗?

laravel - 如何在 Laravel 中插入数据库之前连接自动增量值

php - 联接和相关子查询

php - 在不检索实例的情况下获取相关模型(Laravel 4,Eloquent)的类(名称)

mysql - 计算表中的行数

php - 确定同一 MySQL 表中两个值的时间戳差异

php - 从 While 循环填充 PHP 数组