Laravel Relations:获得产品的评论和相关用户

时间:2018-07-16 06:24:08

标签: php laravel laravel-5 relationship

我的应用程序中有用户评论产品模型。
关系是:

  
      
  • 用户有很多评论
  •   
  • 查看属于用户
  •   
  • 产品有很多评论
  •   
  • 评论属于产品
  •   

我的表格结构是

  

产品表

id | name | price
     

评论表

id | review | rating | user_id | product_id 
     

用户表

id | name |   email | password

当访问特定产品页面时,我想显示该产品的所有评论以及撰写这些评论的用户。所以我尝试了:

$product = Product::where('id','=',$id)->with('reviews')->with('users')->get();  

这当然不起作用,因为ProductUsers没有任何直接关系。
然后,我尝试了Has Many Through关系。在产品模型中:

public function users()
{
    return $this->hasManyThrough('App\User', 'App\Review');
}

这需要product_id表中的Reviews列。
它还期望review_id表中的Users列不存在(并且将其放置在其中没有意义,因为用户可以有很多评论)。

那么做这件事的正确方法是什么?

我如何获得特定产品的所有评论以及撰写这些评论的用户?

2 个答案:

答案 0 :(得分:4)

您可以像这样链接链关系以加点.,以求加载:

$products = Product::where('id','=',$id)->with('reviews')->with('reviews.user')->get();

或者因为reviews.user也需要加载reviews,所以您也可以省略reviews

$products = Product::where('id','=',$id)->with('reviews.user')->get();

然后,您可以按照期望的方式简单地访问用户:

foreach ($products as $product) {
    foreach ($product->reviews as $review) {
        $user = $review->user;
    }
}

答案 1 :(得分:0)

我在Laravel文档中找到了这个。 https://laravel.com/docs/5.6/eloquent-relationships#eager-loading

如果您应用延迟加载,这应该可以工作。但是,使用现有的名称,如果调用评论->用户->名称,则应该能够按需加载用户信息。