Eloquent 嵌套 WHERE 语句

2024-01-15

参加一个在线竞赛,目标是拍摄我所拥有的某些物体users上传中pictures of objects,其中对象有一个category and a 子类别.

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

  ------------------------------------------------ 
  |                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();

非常感谢您的任何提示!


您想要获取包含属于指定用户的图片的类别,因此您可以这样做(有点冗长):

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() part.

如果您还想过滤子类别,请添加一个闭包with() for subcats.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Eloquent 嵌套 WHERE 语句 的相关文章

随机推荐