Xit*_*ish 1 php relationship laravel laravel-5
我的应用中有User、Review和Product Models 。
关系是:
- 用户的hasMany评论
- 评论属于用户
- 产品的hasMany评论
- 评论属于产品
我的表结构是
产品表
Run Code Online (Sandbox Code Playgroud)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
当访问特定产品页面时,我想显示该产品的所有评论以及撰写这些评论的用户。所以我试过:
$product = Product::where('id','=',$id)->with('reviews')->with('users')->get();
Run Code Online (Sandbox Code Playgroud)
当然那没有用,因为Product与Users.
然后我尝试了Has Many Through关系。在产品型号中:
public function users()
{
return $this->hasManyThrough('App\User', 'App\Review');
}
Run Code Online (Sandbox Code Playgroud)
这需要表中的一product_id列Reviews。
它还期望表中有一review_id列Users不存在(并且将其放在那里是没有意义的,因为用户可以有很多评论)。
如何获得特定产品的所有评论以及撰写这些评论的用户?
您可以使用点将关系链接到急切加载,.如下所示:
$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)
| 归档时间: |
|
| 查看次数: |
995 次 |
| 最近记录: |