Laravel 关系:获取产品的评论和相关用户

Xit*_*ish 1 php relationship laravel laravel-5

我的应用中有UserReviewProduct Models 。
关系是:

  • 用户的hasMany评论
  • 评论属于用户
  • 产品的hasMany评论
  • 评论属于产品

我的表结构是

产品表

id | name | price
Run Code Online (Sandbox Code Playgroud)

评论表

id | review | rating | user_id | product_id 
Run Code Online (Sandbox Code Playgroud)

用户表

id | name |   email | password
Run Code Online (Sandbox Code Playgroud)

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

$product = Product::where('id','=',$id)->with('reviews')->with('users')->get();  
Run Code Online (Sandbox Code Playgroud)

当然那没有用,因为ProductUsers.
然后我尝试了Has Many Through关系。在产品型号中:

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

这需要表中的一product_idReviews
它还期望表中有一review_idUsers不存在(并且将其放在那里是没有意义的,因为用户可以有很多评论)。

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

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

Nam*_*hek 6

您可以使用点将关系链接到急切加载,.如下所示:

$products = Product::where('id','=',$id)->with('reviews')->with('reviews.user')->get();
Run Code Online (Sandbox Code Playgroud)

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

$products = Product::where('id','=',$id)->with('reviews.user')->get();
Run Code Online (Sandbox Code Playgroud)

然后,您可以按预期简单地访问用户:

foreach ($products as $product) {
    foreach ($product->reviews as $review) {
        $user = $review->user;
    }
}
Run Code Online (Sandbox Code Playgroud)