【问题标题】:laravel 5.3 can't access property after loading a relationship via accessorlaravel 5.3 通过访问器加载关系后无法访问属性
【发布时间】:2016-11-23 18:12:10
【问题描述】:

最初,我需要从评论表中获取所有产品的平均评分。我已经找到了如何做到这一点的方法,但是当我想访问访问器值时,我被困了几个小时。我想向视图显示聚合的内容,但是我尝试过的每件事都不起作用。请帮忙。

产品型号

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

产品控制器

 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

【问题讨论】:

    标签: php laravel accessor


    【解决方案1】:

    解决办法是这样写函数:

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

    【讨论】:

    • 这没有帮助。它显示了这个错误: Builder.php 第 674 行中的 FatalThrowableError: Call to a member function addEagerConstraints() on float
    • 你试过不带括号吗?像这样:$this->productreviews->avg('rating')
    • 公共函数 ScopeAvgRating($query) { return $query->productreviews()->avg('rating'); }
    • 错误,错误。 Builder.php 第 2448 行中的 BadMethodCallException:调用未定义的方法 Illuminate\Database\Query\Builder::productreviews()
    • 我已经建立了解决方案。一种有效产品的默认评级设置为空。这就是遇到错误的原因:无法访问非对象的属性。 @Yohanan Baruchel 感谢您的解决方案。
    猜你喜欢
    • 2020-02-08
    • 2023-03-17
    • 2015-10-13
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 2020-04-16
    相关资源
    最近更新 更多