Laravel Eloquent一对多关系过滤器具有多个标准

时间:2017-08-01 12:36:15

标签: php laravel laravel-5 model eloquent

作品

$comments = App\Post::find(1)->comments()->where('title', 'foo');

这不起作用

$comments = App\Post::where('id', '=', $id)
->where('column', '=', $val)
->comments()->where('title', 'foo');

期望获得按idcolumn

过滤的模型集合

5 个答案:

答案 0 :(得分:1)

可能您收到undefined method错误。您正试图在Eloquent Builder类上调用comments()。这将解决您的问题。

$comments = App\Post::where('id', '=', $id)
    ->where('column', '=', $val)
    ->where('title', 'foo')
    ->first()->comments;

答案 1 :(得分:0)

where子句不返回集合,您应首先获得一个集合,之后您可以应用其他子句。

即:

$comments = App\Post::where('column', $val)
  ->where('id', $id)
  ->first()
  ->comments
  ->where('title', 'foo');

此外'='where子句的默认值,因此可以省略它们。

答案 2 :(得分:0)

您可以向Model::with()laravel documentation)的关系添加其他查询,以反对返回的元素:

$comments = App\Post::where("id", $id)
    ->where("column", $val)
    ->with(["comments" => function ($query) {
        $query->where("title", "foo");
    }])
    ->first()
    ->comments;

答案 3 :(得分:0)

每当您尝试访问模型函数时,您都需要模型类的对象。

在第一种情况下,你有模型对象,所以你可以在那之后添加查询,这样可以很好地工作。

在第二种情况下,

App\Post::where('id', '=', $id)
          ->where('column', '=', $val)
          ->comments()
          ->where('title', 'foo');

在应用模型函数Post之前,需要获取comments()对象。但是在这里,您将获得Query Builder。因此,您无法在其上应用模型功能。

如果只搜索您的行,则可以使用find()first()功能。

如果有多个结果,不是一个好的解决方案,但你可以迭代for循环。

$posts = App\Post::where('id',$id)
         ->where('column',$val)
         ->get();

foreach($posts as post){
   // Acess like $post->comments
}

答案 4 :(得分:0)

如果您有人际关系,可以加入Eager Loading并传递一项功能,为查询添加条件,例如:

$comments = App\Post::with([‘comments’ => function($query) { 
                $query->where(‘title’, ‘foo’);
            }])->where(‘column’, $val)->find($id);