对于拍摄特定的对象我有目标的一个在线竞赛 用户 上传 图片 的 对象 ,其中对象具有 类别 和 子类别 。
用户的仪表板应如下所示:
------------------------------------------------ | 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();
问题:
对于仪表板,我当然只希望来自某个用户的图像: Pictures 模型包含一个 user_id 字段。我可以直接获取用户的图片:Pictures::where('user_id',$user->id)->get();,但是我没有对象中的结构来创建上面显示的所需视图。
Pictures::where('user_id',$user->id)->get();
我该如何做这样的事情:
$userPics = Category::with([...])->where('user_id',$user->id)->get();
非常感谢您的提示!
您想要获得包含属于指定用户的图片的类别,因此您可以这样做(有点冗长):
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()一部分即可。
如果你也想过滤的子类别,封闭增加with()了subcats。
subcats