Php 以laravel显示用户详细信息及其平均评分

Php 以laravel显示用户详细信息及其平均评分,php,laravel,laravel-5,laravel-5.3,laravel-5.4,Php,Laravel,Laravel 5,Laravel 5.3,Laravel 5.4,在我的例子中,我有两个表,如用户表和评级表 在用户表中,我存储用户的个人详细信息,如姓名、电子邮件等 在评分表中,我正在存储用户id和评分(评分将以1、2、3、4和5等数字表示) 我已经创建了两个表 这是关系 //User Model public function ratings() { return $this->hasMany(Rating::class); } //Rating model public function user() { return $this

在我的例子中,我有两个表,如用户表和评级表

用户表中,我存储用户的个人详细信息,如姓名、电子邮件等

评分表中,我正在存储用户id和评分(评分将以1、2、3、4和5等数字表示)

我已经创建了两个表 这是关系

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

//Rating model
public function user()
{
    return $this->belongsTo(Consultant::class);
}
我可以通过快速加载显示get数据

 $data = User::with('ratings')->get();
我将得到的回应是

 [
 {
 "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
            }
    ]
 }
]

那么,如何获得每个用户的平均评分呢?

要获得每个用户的平均评分,您可以这样做

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

你可以这样做

$data = User::with('ratings')
->join('Rating table','user.id','=','Rating table.user_id')
->select('user.*',DB::raw('avg(rating_for_user)'))
->get();
$product=Products::where('id',$productid);
$data=$product->with('ratings')->get();
foreach($data as $d) {
   return $d->ratings->avg('rating'); 
}
根据需要修改代码


我希望能有所帮助。

您可以获得这样的平均评分

$data = User::with('ratings')
->join('Rating table','user.id','=','Rating table.user_id')
->select('user.*',DB::raw('avg(rating_for_user)'))
->get();
$product=Products::where('id',$productid);
$data=$product->with('ratings')->get();
foreach($data as $d) {
   return $d->ratings->avg('rating'); 
}
我添加了产品平均评级代码,其中有两种型号,如下所示:

产品型号:

<?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");
}
}
<?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");
}
}

如果您想获得多个用户的评分,可以这样做

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

这将始终在产品中附加“平均”评分字段。我使用变形关系进行评级,但您可以使用适合您情况的任何关系。
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');
    }

}

你试过
join
avg
功能吗?是的,我试过@SagarGautam,如果用户在我使用join和avg时没有评分,则不会显示用户详细信息。我发布了一个答案,但删除了它,这就是你在Laravel中的做法。您好@giolianosulit,从那里您可以获得$User变量。@justin我想您是指我。$user was变量只是一个示例。如果数据包含多个用户,则必须使用foreach迭代数据,例如,在设置
User::with('ratings')->get()后,可以在
$data
变量上使用该数据。但是您需要首先循环使用
$data
,然后才能执行
$data->ratings()->avg('rating_for_user')是的,我做了相同的$data=User::with(“'ratings”);foreach($d形式的数据){$ratings=$data->ratings()->avg('rating_for_user');return$rating;}谢谢兄弟…@sagarThis查询只有在用户至少有一个评级时才有效,如果用户没有评级,则不会提供用户详细信息。可能是,也可能不是。它可能只获取用户数据,而没有评级。对不起,我不确定。我已经试过了。它获取有评分的用户,并且查询中缺少group by。非常感谢。