我的应用程序中有用户,评论和产品模型。
关系是:
- 用户有很多评论
- 查看属于用户
- 产品有很多评论
- 评论属于产品
我的表格结构是
产品表
id | name | price
评论表
id | review | rating | user_id | product_id
用户表
id | name | email | password
当访问特定产品页面时,我想显示该产品的所有评论以及撰写这些评论的用户。所以我尝试了:
$product = Product::where('id','=',$id)->with('reviews')->with('users')->get();
这当然不起作用,因为Product
与Users
没有任何直接关系。
然后,我尝试了Has Many Through关系。在产品模型中:
public function users()
{
return $this->hasManyThrough('App\User', 'App\Review');
}
这需要product_id
表中的Reviews
列。
它还期望review_id
表中的Users
列不存在(并且将其放置在其中没有意义,因为用户可以有很多评论)。
我如何获得特定产品的所有评论以及撰写这些评论的用户?
答案 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
如果您应用延迟加载,这应该可以工作。但是,使用现有的名称,如果调用评论->用户->名称,则应该能够按需加载用户信息。