Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Laravel:cách lấy giá trị trung bình trên các mối quan hệ hasMany lồng nhau (hasManyThrough)

Bạn cần một cái gì đó như thế này http://softonsofa.com/tweaks-eloquent-relations-how-to-get-hasmany-relation-count-efficiently/ chỉ được điều chỉnh một chút để phù hợp với nhu cầu của bạn:

public function reviewRows()
{
    return $this->hasManyThrough('ReviewRow', 'Review');
}

public function avgRating()
{
    return $this->reviewRows()
      ->selectRaw('avg(rating) as aggregate, product_id')
      ->groupBy('product_id');
}

public function getAvgRatingAttribute()
{
    if ( ! array_key_exists('avgRating', $this->relations)) {
       $this->load('avgRating');
    }

    $relation = $this->getRelation('avgRating')->first();

    return ($relation) ? $relation->aggregate : null;
}

Sau đó, đơn giản như sau:

// eager loading
$products = Product::with('avgRating')->get();
$products->first()->avgRating; // '82.200' | null

// lazy loading via dynamic property
$product = Product::first()
$product->avgRating; // '82.200' | null


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Chọn WHERE trong thứ tự nhất định

  2. Tại sao giới hạn thời gian tối đa của MySQL là 838:59:59?

  3. MySQL:giao dịch trong một thủ tục được lưu trữ

  4. MySQL:% viết tắt của cột máy chủ lưu trữ là gì và cách thay đổi mật khẩu của người dùng

  5. Đặt thời gian thực thi tối đa trong MYSQL / PHP