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

Posted

技术标签:

【中文标题】Laravel 关系:获取产品的评论和相关用户【英文标题】:Laravel Relations : Get Reviews and associated Users of a Product 【发布时间】:2018-12-23 15:22:19 【问题描述】:

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

用户有很多评论 查看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();  

当然这不起作用,因为ProductUsers 没有任何直接关系。 然后我尝试了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 关系模型如何通过帖子模型在评论模型中获取作者姓名

LARAVEL 5.3,获取用户名和角色名(使用 Laravel 模型关系)

Laravel 获取所有关系和分页关系数据

我不知道如何在Laravel中将表连接到另一个表

相关模型 eloquent laravel 中的自定义查询

在 Laravel 中获取用户名和带有文章 id 的评论