2016-11-23 16 views
1

最初は、すべての商品のレビューテーブルから平均評価を取得する必要がありました。私はそれを行う方法を確立しましたが、アクセサー値にアクセスしたい時は何時間も立ち往生しています。私は、集約の内容を表示するが、私が試したすべてのこと、仕事をしていないことを表示したい。助けてください。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]); 

}

は、showメソッドから応答を返し

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

答えて

0

ソリューションは、機能をこのように書いている:

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

このdosen'tヘルプを。それはこのエラーを示しています:Builder.phpのFatalThrowableError行674: メンバー関数addEagerConstraints()をfloatで呼び出す –

+0

カッコなしで試しましたか?このように: $ this-> productreviews-> avg( '評価') –

+0

はい、同じ結果です。 –

関連する問題