laravel 5.3 не может получить доступ к свойству после загрузки отношений через аксессор

Первоначально мне нужно было получить средний рейтинг из таблицы отзывов для всех продуктов. Я нашел способ, как это сделать, но я застрял на несколько часов, когда хочу получить доступ к значению доступа. Я хочу отобразить содержимое агрегата, но все, что я пробовал, не работает. Пожалуйста помоги.

Модель продукта

protected $table = 'products';

protected $fillable = ['title','body'];public function scopeActive($query, $default = true){
$query->where('active',$default)->orderBy('created_at','desc');
}

public function productreviews(){
return $this->hasMany(Review::class);
}

public function avgRating(){

return $this->hasOne(Review::class)->selectraw('avg(rating) as aggregate,product_id')->groupBy('product_id');
}public function getAverageAttribute(){

if (!$this->relationLoaded('avgRating')){
$this->load('avgRating');
}
$relation = $this->getRelation('avgRating');

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

Модель обзора

protected $table = 'reviews';

protected $fillable = ['user_id','body','rating'];

public function product(){
return $this->belongsTo(Product::class);
}

ProductsController

 public function show(Product $product){
$getAllProducts = $product->with('avgRating')->active()->get();
return view('products.allproducts',['products'=>$getAllProducts]);

}

Возвращенный ответ от метода показа

    [{"id":1,"title":"Ipsum quos libero iusto.","body":"Ipsum temporibus              tenetur voluptates.","active":1,"created_at":"2016-11-23   12:44:02","updated_at":"2016-11-23 12:44:02","avg_rating":{"aggregate":4.5,"product_id":1}},{"id":2,"title":"Ab ducimus quia sed quia pariatur officiis.","body":"Cupiditate aut nihil at est.","active":1,"created_at":"2016-11-23 12:44:02","updated_at":"2016-11-23 12:44:02","avg_rating":{"aggregate":4,"product_id":2}}]

Посмотреть

 @extends('layouts.app')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-default">
<div class="panel-heading">Products</div>

<div class="panel-body">
@foreach($products as $product)

@if($product->active)
<div class='alert alert-info'>
<h1>{{ $product->title}}</h1>
<p>{{ $product->body }}</p>
<p>{{ $product->avg_rating->aggregate }}</p>
</div>
@endif@endforeach
</div>
</div>
</div>
</div>
</div>
@endsection

1

Решение

Решением является написание функции следующим образом:

public function avgRating() {
return $this->productreviews()->avg('rating');
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector