【问题标题】:Laravel where condition in relationshipLaravel 关系中的条件
【发布时间】:2021-10-19 15:06:46
【问题描述】:

我有一段时间遇到问题.. 我有一个动漫节目列表,每个都有多种流派,我想创建一个过滤器,用户只能选择包含某些特定流派的过滤器。

我有 3 个表格:anime_showsgenresanime_show_genres(在最后一个表格中我有 2 个列 anime_show_id, genre_id)。

我当前代码的问题是我得到了至少有 1 种流派的所有动漫节目,所以我使用 OR 插入 AND。我还尝试在 whereHas 内执行 forEach,但没有成功。

$anime = AnimeShow::select('id', 'slug', 'status', 'title_eng', 'title_jap', 'description', 'episodes', 'premier_date', 'status')
        ->with('media:anime_show_id,image_path');

if($request->genres){
    $genres = $request->genres ? $request->genres : [];
    $anime->whereHas('genres', function($q) use($genres){
        $q->whereIn('id',$genres);
    });
}

if($request->airing){
    $anime->whereIn('status', $request->airing);
}

$anime->search($request->search);
        
return response($anime->paginate($request->perPage, ['*'], 'page', $request->currentPage));

【问题讨论】:

  • 这个查询构建了所有ANDs 你提到的OR 在哪里?
  • 基本上,当我使用 whereIn 时,我得到的所有节目至少包含一种类型而不是两种类型。
  • whereIn 将匹配任何类型,而不仅仅是所有类型。您必须遍历类型以构建查询
  • @aynber 有一些解决方案无需在应用程序中使用joins 进行迭代。需要一点时间来写和分析,让我们看看:D
  • 我尝试在 whereHas 中使用 forEach 并且在那里我做了: $q->where('id', $value);但在这种情况下,当我只有一种类型时有效,在添加第二种类型后,我没有得到任何结果。

标签: php laravel eloquent laravel-7


【解决方案1】:

尝试像这样循环流派:

$genres = $request->genres ?: [];

foreach ($genres as $genre) {
    $anime->whereHas('genres', function($q) use ($genre) {
        $q->where('id', $genre);
    });
}

这将是具有 A 类和 B 类的动漫等等。

【讨论】:

  • 是的!直到现在我尝试了类似的东西,但是 forEach 在里面 whereHas 并且没有工作。谢谢!
猜你喜欢
  • 2021-10-09
  • 2021-08-30
  • 1970-01-01
  • 2014-11-15
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
相关资源
最近更新 更多