对于以拍摄某些物品为目标的在线竞赛,我有用户上传对象的图片,其中对象有类别和子类别。
用户的信息中心应如下所示:
------------------------------------------------
| Category |
------------------------------------------------
| ----------------------------------------- |
| | Subcat. | Subcat. | |
| |------------------|--------------------| |
| |Object1 | Object2 | Object1 | Object2 | |
| |------------------|--------------------| |
| | Pic1 | Pic1 | Pic1 | Pic1 | |
| | Pic2 | Pic2 | Pic2 | Pic2 | |
| ---------------------------------------- |
| |
------------------------------------------------
为了能够在适当的循环中输出图片,我在模型之间安装了 hasMany 关系。所以我可以通过
获得一个方便的层次结构的对象$userPics = Category::with(['subcats','subcats.objects','subcats.objects.pics'])->get();
问题:
对于仪表板,我当然只想要某个用户的图像:图片模型包含 user_id 字段。我可以直接获取用户的图片:Pictures::where('user_id',$user->id)->get();
,但是我没有对象中的结构来创建上面显示的所需视图。
我该怎么做:
$userPics = Category::with([...])->where('user_id',$user->id)->get();
非常感谢任何提示!
答案 0 :(得分:1)
您希望获取包含属于指定用户的图片的类别,因此您这样做(有点冗长):
Category::with(['subcats', 'subcats.objects' => function ($q) use ($user) {
$q->with(['pictures' => function ($q) use ($user) {
$q->where('user_id', $user->id);
}]);
}])
->whereHas('subcats', function ($q) use ($user) {
$q->whereHas('objects', function ($q) use ($user) {
$q->whereHas('pictures', function ($q) use ($user) {
$q->where('user_id', $user->id);
});
});
})
->get();
您需要在此处使用嵌套的with()
闭包,因为您可以使用点表示法加载两个以上的关系级别。
如果您不需要加载图片和子类别数据,只需删除with()
部分。
如果您还要过滤子类别,请为with()
的{{1}}添加一个闭包。