【发布时间】:2021-10-19 15:06:46
【问题描述】:
我有一段时间遇到问题.. 我有一个动漫节目列表,每个都有多种流派,我想创建一个过滤器,用户只能选择包含某些特定流派的过滤器。
我有 3 个表格:anime_shows、genres 和 anime_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