【问题标题】:Showing images related to reviews显示与评论​​相关的图像
【发布时间】:2017-11-19 18:18:44
【问题描述】:

我正在尝试展示与我的评论相关的图片。我目前正在获取此集合实例上不存在的 -Property [图片]。我将如何检索与评论相关的图像。

这是我的桌子 产品:id、名称、价格 评论:id、评论、products_id_fk 图片:id、图片、Reviews_id_fk

这是我的模型 产品:

class Product extends Model
{
    public function reviews()
    {
        return $this->hasMany('App\Reviews','reviews_id');
    }
}

评论:

class Reviews extends Model
{
    //
    public function products(){
        return $this->belongsTo('App\Product');
    }
    public function author()
    {
        return $this->belongsTo('App\User','user_id');
    }
    public function pictures()
        {
            return $this->hasMany('App\Pictures');
        }

}

图片模型:

class Picture extends Model
{
    //

    public function author()
    {
        return $this->belongsTo('App\User','user_id');
    }
    public function reviews()
    {
        return $this->belongsTo('App\Reviews');
    }

}

产品控制器:

public function getSingle($slug )
{
    //fetch from the database based on slug.
    $product = Products::where('slug', '=', $slug)->first();





    //return view
    return view('products.single')->withProduct($product);

}

查看刀片:

        @foreach($product->reviews as $reviews)


                <div class="col-md-9">
                <div class="content">


                    <div class="review-info">
                    <p>{{$reviews->review}}</p>

                </div>
                    <div class="images">
                        @foreach ($reviews->pictures as $picture)

                            <img src="{{asset('images/' . $picture->image)}}">




                        @endforeach


                    </div>

【问题讨论】:

    标签: laravel laravel-5 laravel-5.4


    【解决方案1】:

    您在从图片到评论的关系中缺少外键名称。

    图片模型应如下所示:

    class Picture extends Model
    {
        public function author()
        {
            return $this->belongsTo('App\User','user_id');
        }
        public function review()
        {
            return $this->belongsTo('App\Review', 'Reviews_id_fk');
        }
    }
    

    Review 模型应如下所示:

    class Review extends Model
    {
        public function product()
        {
            return $this->belongsTo('App\Product', 'products_id_fk');
        }
        public function author()
        {
            return $this->belongsTo('App\User','user_id');
        }
        public function pictures()
        {
            return $this->hasMany('App\Picture', 'Reviews_id_fk', 'id');
        }
    }
    

    产品模型应如下所示:

    class Product extends Model
    {
        public function reviews()
        {
            return $this->hasMany('App\Review','products_id_fk');
        }
    }
    

    Eloquent 的默认命名约定是在图片表中查找名为review_id 的字段,但是由于您的命名不同,因此需要像我上面所做的那样在关系方法中指定它。有了这个,您应该能够使用以下内容:

    @foreach($product->reviews as $reviews)
        ...
        @foreach($reviews->pictures as $picture)
            ...
            <img src="{{asset('images/' . $picture->image)}}">
        @endforeach
    @endforeach
    

    如果您在图片模型上将Reviews_id_fk 字段的名称更改为review_id,则可以省略在关系方法中指定外键和本地键。

    我还将几个方法的名称从复数更改为单数,以更好地遵循惯例。模型也应该是单数的,因为它们代表一个单一的实体。我在上面的变化中也反映了这一点。

    您还可以取消图片和用户之间的关系,因为这是通过评论模型建立的。

    $picture->review->author
    

    【讨论】:

    • 伙计,我听到你在说什么,但我仍然得到错误。 此集合实例上不存在属性 [图片]。 问题是否可能是第一个 foreach 不允许第二个进入其模型,因为评论已通过 $product 调用?
    • 尝试将protected $with = ['pictures']; 添加到您的Review 模型中,似乎它并不急于正确加载图片。
    • 返回同样的问题。此集合实例上不存在属性 [图片]。
    • 这里缺少一些基本的东西...将控制器中 $product 的查询更改为 $product = Products::with('reviews')-&gt;where('slug', '=', $slug)-&gt;first();
    • 太棒了!急切加载有时会很痛苦,请记住,当您在模型上设置 $with 属性时,它会强制它每次都查询该关系,因此它可能会获得非常昂贵的性能!
    猜你喜欢
    • 1970-01-01
    • 2012-07-20
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 1970-01-01
    • 2013-06-05
    • 2018-10-12
    相关资源
    最近更新 更多