【问题标题】:Laravel ORM nested relationships with constraintsLaravel ORM 带有约束的嵌套关系
【发布时间】:2015-03-01 10:52:08
【问题描述】:

我想知道如何在 Laravel 4.1 中使用约束执行嵌套关系查询。

这是一个有效的参考查询:

$users = User::with("careers.specialty.faculty.university")->get();

如您所见,有多个嵌套模型(具有各种关系类型)。

我想为一个或多个模型加载一个可选约束,例如一个教师姓名...

实现这一目标的最佳(和最简单)方法是什么?

这是我到目前为止所尝试的,但似乎没有考虑约束(所有用户都返回)。

    $users = User::with([
        'careers'=> function($query)use($levelInput){
                if ($levelInput ==""){
                    $query->get();
                }else{
                    $query->where('level','=',$levelInput)->get();
                }
            },
        'careers.specialty'=> function($query)use($specialtyInput){
                if ($specialtyInput ==""){
                    $query->get();
                }else{
                    $query->where('name','like','%'.$specialtyInput.'%')->get();
                }
            },
        'careers.specialty.faculty'=> function($query)use($facultyInput){
                if ($facultyInput ==""){
                    $query->get();
                }else{
                    $query->where('name','like','%'.$facultyInput.'%')->get();
                }
            },
        'careers.specialty.faculty.university'=> function($query)use($universityInput){
                if ($universityInput ==""){
                    $query->get();
                }else{
                    $query->where('name','like','%'.$universityInput.'%')->get();
                }
            }
        ])->get();

编辑:感谢 Maksym Cierzniak 接受的答案,这是一个解决方案:

$users = User::whereHas('promos',function($q)use($levelInput,$specialtyInput,$facultyInput,$universityInput){
        $q->where('level','like','%'.$levelInput.'%')->whereHas('specialty',function($q)use($specialtyInput,$facultyInput,$universityInput){
            $q->where('name','like','%'.$specialtyInput.'%')->whereHas('faculty',function($q)use($facultyInput,$universityInput){
                $q->where('name','like','%'.$facultyInput.'%')->whereHas('universities',function($q)use($universityInput){
                    $q->where('name','like','%'.$universityInput.'%');
                });
            });
        });
    })->get();

嗯,这段代码看起来很丑。但它确实有效,如果您有更好的选择,请随时分享:)

【问题讨论】:

    标签: laravel-4 nested relationships


    【解决方案1】:

    with 以这种方式工作,因此关系会急切地加载到您正在寻找的基本模型中。在这种情况下,您将始终获得所有 User 记录,然后 Laravel 将尝试获取所有这些记录的关系。如果您想加载关系有某种约束的所有用户,您应该尝试whereHas 方法。这样,如果您例如调用

    $posts = Blog::whereHas('comments', function($query){
       $query->where('content', 'like', 'foo%');
    })->get();
    

    这样你只会得到Blog,它有一些带有content的cmets,比如foo。我希望这就是您正在寻找的。​​p>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-26
      • 2014-10-23
      • 2015-11-17
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      相关资源
      最近更新 更多