首页 文章

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

提问于
浏览
0

我的应用中有 UserReviewProduct 型号 .
关系是:

用户hasMany评论评论belongsTo用户产品hasMany评论评论belongsTo产品

我的表结构是

产品表id |名字|价钱
评论表ID |审查|评级| user_id | PRODUCT_ID
用户表ID |名字|电子邮件|密码

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

$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 列不存在(并且将其放在那里是没有意义的,因为用户可以有很多评论) .

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

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

2 回答

  • 0

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

    $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;
        }
    }
    
  • 4

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

    如果您应用延迟加载,这应该有效 . 但是,如果您使用的是_1179919_,则应该能够按需加载用户信息 .

相关问题