【问题标题】:Laravel 5.2 Many to Many query relationship with where clauseLaravel 5.2 与 where 子句的多对多查询关系
【发布时间】:2018-05-18 13:19:57
【问题描述】:

我有一个小问题,我有一张电影表格和另一张流派例如:动作、冒险等...

表名:

  • 电影
  • 电影类型
  • 类型

我想获取所选类型的所有电影,例如:动作

$movies = Movie::with('genres')
            ->when($genre, function ($query) use ($genre) {
                        return $query->where('genres.id', $genre->id);
                    })
            ->paginate(20);

这个php代码不起作用,我怎样才能让它起作用?

PS:流派通过 $_GET['genre'] 从视图中转移并存储在变量 $genre 中。

在@Shane 和@Marcin Nabiałek 的回答之后编辑:

关系是在模型中设置的,当我像这样直接使用你的代码时:

Movie::with('genres', 'countries', 'type')
            ->when($type, function ($query) use ($type) {
                        return $query->where('medias.type_id', $type->id);
                    })
            ->whereHas('genres', function ($query) use ($genre) {
                 return $query->where('genres.id', $genre->id);
               })
            ->paginate(20);

它工作得很好,但使用 when() 函数却不能。我必须使用when() 来使条件仅在用户选择了流派时才起作用。

【问题讨论】:

  • 您是在$_GET['genre'] 中获得多个值还是单个值?
  • $_GET['genre'] 只得到一个值。 whereHas 可以完美地工作,但不能与 when() 一起使用,我使用它来使条件仅在用户选择了流派时才起作用。

标签: php laravel-5 eloquent laravel-5.2


【解决方案1】:

您应该使用whereHas 来获取分配给给定类型的所有电影:

$movies = Movie::with('genres')
            ->when($genre, function ($query) use ($genre) {
                  $query->whereHas('genres', function($q) use ($genre) {
                     return $query->where('id', $genre->id);
                   });                                  
            })->paginate(20);

如果 $genre 只是 id 而不是模型,你应该使用:

 return $query->where('id', $genre);

如果它是一个数组(用户可以选择多种类型),你应该使用:

 return $query->whereIn('id', (array) $genre);

【讨论】:

  • 当我在没有->when() 的情况下使用您的代码并像这样直接使用它时:$movies = Movie::with('genres', 'countries', 'type') ->when($type, function ($query) use ($type) { return $query->where('medias.type_id', $type->id); }) >whereHas('genres', function ($query) use ($genre) { return $query->where('genres.id', $genre->id); }) ->paginate(20); 它工作得很好,但是使用 when() 函数时它就不行了
【解决方案2】:

我不熟悉when 函数。我用whereHas:

$movies = Movie::whereHas('genres', function ($query) use ($genre) {
    $query->where('id', $genre->id);
})->with('genres')->get();

另外,$genre 是型号还是 ID?您提到它是从$_GET 收到的,这意味着它可能是一个 ID。

我认为更好的解决方案是在Genre 模型中使用您的关系函数来获取它们:

$movies = Genre::find($genre_id)->movies;

【讨论】:

  • $genre 是模型,因为我从数据库中获取 id 并将其存储在变量 $genre 中。
  • @Chidox 我将使用第二个示例。将$genre_id 替换为$genre->id。您只需要确保在Genre 模型中设置了关系:public function movies() { return $this->belongsToMany('App\Movie'); }
  • 关系是在模型中设置的,当我像这样直接使用你的代码时: $movies = Movie::with('genres', 'countries', 'type') ->when($ type, function ($query) use ($type) { return $query->where('medias.type_id', $type->id); }) >whereHas('genres', function ($query) use ($流派) { 返回 $query->where('genres.id', $genre->id); }) ->paginate(20);它工作得很好,但是使用 when() 函数却不能。我必须使用when() 使条件仅在用户选择了流派时才起作用。
  • @Chidox 如果用户没有在$_GET 变量中提供流派,它应该怎么做?
  • 出现错误Undifined variable : $genre 类似这样。
猜你喜欢
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 2018-11-02
相关资源
最近更新 更多