Laravel 关系:获取产品的评论和相关用户
Posted
技术标签:
【中文标题】Laravel 关系:获取产品的评论和相关用户【英文标题】:Laravel Relations : Get Reviews and associated Users of a Product 【发布时间】:2018-12-23 15:22:19 【问题描述】:我的应用中有 User、Review 和 Product 模型。 关系是:
用户有很多评论 查看belongsTo用户 产品有很多评论 查看belongsTo产品
我的表结构是
产品表
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');
这需要Reviews
表中有一个product_id
列。
它还期望Users
表中不存在review_id
列(并且将其放在那里没有意义,因为用户可以有很多评论)。
那么正确的做法是什么?
如何获取特定产品的所有评论以及撰写这些评论的用户?
【问题讨论】:
【参考方案1】:您可以使用点 .
将关系链接到预加载,如下所示:
$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;
【讨论】:
没错。您可以删除 ´->with(''reviews')´ 无论如何都会自动加载以到达用户表: ´$products = Product::where('id','=',$id)->with( 'reviews.user')->get();'【参考方案2】:我在 Laravel 文档中找到了这个。 https://laravel.com/docs/5.6/eloquent-relationships#eager-loading
如果您应用延迟加载,这应该可以工作。但是,根据您所拥有的,如果您调用 review->user->name,您应该能够按需加载用户信息。
【讨论】:
以上是关于Laravel 关系:获取产品的评论和相关用户的主要内容,如果未能解决你的问题,请参考以下文章
laravel 关系模型如何通过帖子模型在评论模型中获取作者姓名