一尘不染

雄辩的嵌套WHERE语句

sql

对于拍摄特定的对象我有目标的一个在线竞赛 用户 上传 图片对象 ,其中对象具有 类别子类别

用户的仪表板应如下所示:

  ------------------------------------------------ 
  |                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();,但是我没有对象中的结构来创建上面显示的所需视图。

我该如何做这样的事情:

$userPics = Category::with([...])->where('user_id',$user->id)->get();

非常感谢您的提示!


阅读 161

收藏
2021-03-08

共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()subcats

2021-03-08