Eloquent嵌套WHERE语句

时间:2017-05-18 18:06:34

标签: php sql laravel eloquent

对于以拍摄某些物品为目标的在线竞赛,我有用户上传对象图片,其中对象有类别子类别

用户的信息中心应如下所示:

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

非常感谢任何提示!

1 个答案:

答案 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}}添加一个闭包。