user8203594
user8203594

Reputation:

Display user details with their average rating in laravel

In my case, I have two table like users table and rating table.

In user table, I'm storing user's personal details like name, email etc,

In rating table, I'm storing user_id and rating(rating will be in numbers like 1,2,3,4 and 5)

I have created relationship two tables here is the relation

//User Model
public function ratings()
{
    return $this->hasMany(Rating::class);
}

//Rating model
public function user()
{
    return $this->belongsTo(Consultant::class);
}

I can able to display get data with eager loading

 $data = User::with('ratings')->get();

The Response I'll get from eager load is

 [
 {
 "id": 1,
 "cunsultant_name": "Quincy Jerde",
 "contact_number": "882-904-3379",
    "ratings": [
    {

        "user_id": 1,
        "rating_for_user": 3

    },
    {

        "user_id": 1,
        "rating_for_user": 5
    },
    {

        "user_id": 2,
        "rating_for_user": 3
    }
    ]
    },
    {
   "user_name": "Alene Dicki",
   "contact_number": "247.604.8170",
        "ratings": [
            {
                "id": 4,
                "user_id": 3,
                "rating_for_user": 3
            }
    ]
 }
]

So how can I get an average rating for every user with eager loading?

Upvotes: 5

Views: 12136

Answers (5)

Awais Jameel
Awais Jameel

Reputation: 2206

This will always append average_rating field in product. I use morph relation for ratings but you can use any relation appropriate for your situation.

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Product extends Model
{
    protected $guarded  = [];

    protected $appends = ['average_rating'];


    public function ratings()
    {
        return $this->morphMany(Rating::class, 'rateable');
    }

    public function getAverageRatingAttribute()
    {
        return $this->ratings()->average('value');
    }

}

Upvotes: 1

Muhammad
Muhammad

Reputation: 387

If you want to get ratings of multiple users you can do like this.

  $users = User::where('type', 'instructor')->get();
  foreach ($users as $user) {
      $user['ratings'] = $user->ratings()->avg('rate');
  }
  return $users;

Upvotes: -1

Gauravbhai Daxini
Gauravbhai Daxini

Reputation: 2190

You can get avg rating like this,

$product=Products::where('id',$productid);
$data=$product->with('ratings')->get();
foreach($data as $d) {
   return $d->ratings->avg('rating'); 
}

I have added code for product avg rating where two model like below:

Product Model:

<?php

namespace App\Model;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\URL;

class Products extends Model {

protected $table = "products";
public $timestamps = false;

public function ratings()
{
 return $this->hasMany("App\Model\Reviews","p_id");
}
}

Review Model:

<?php

namespace App\Model;

use Illuminate\Database\Eloquent\Model;

class Reviews extends Model
{
protected $table = "product_reviews";
public $timestamps = false;

//Rating model
public function products()
{
    return $this->belongsTo("App\Model\Products");
}
}

Upvotes: -2

Ritesh Khatri
Ritesh Khatri

Reputation: 1301

You can do it like this,

$data = User::with('ratings')
->join('Rating table','user.id','=','Rating table.user_id')
->select('user.*',DB::raw('avg(rating_for_user)'))
->get();

Modify the code as per your need.

I hope it help.

Upvotes: 0

julianstark999
julianstark999

Reputation: 3616

To get the average rating with eager loading you can do

$user->ratings()->avg('rating_for_user');

Upvotes: 14

Related Questions