【发布时间】:2021-06-16 05:53:15
【问题描述】:
我有什么
movies多对多stars
movies多对多tags
studio一对多movies
我将studio 名称、star 名称和/或tag 名称作为可选查询字符串传递
我需要什么
- 如果所有 3 个都作为参数传递,则选择所有
movies和tag和star和studio - 选择所有
movies和tag和star(如果这两个作为参数传递) - 如果
movies和star和studio作为参数传递,则选择所有movies - 如果
movies和tag和studio作为参数传递,则选择所有movies - 选择所有
movies和tag或star或studio(如果有任何一个作为参数传递) - 基本上,简化此查询
我可能很愚蠢的代码
public function index(Request $request)
{
$movies = Movie::with('stars')->with('tags')->with('studio');
// all matches
// if all params are present
if ($request->star && $request->tag && $request->studio)
$movies->whereHas('stars', function ($query) use ($request) {
$query->where('name', $request->star);
})->whereHas('tags', function ($query) use ($request) {
$query->where('name', $request->tag);
})->whereHas('studio', function ($query) use ($request) {
$query->where('name', $request->studio);
});
// star and tag with no studio
if ($request->star && $request->tag && !$request->studio)
$movies->whereHas('stars', function ($query) use ($request) {
$query->where('name', $request->star);
})->whereHas('tags', function ($query) use ($request) {
$query->where('name', $request->tag);
});
// star and studio with no tag
if ($request->star && !$request->tag && $request->studio)
$movies->whereHas('stars', function ($query) use ($request) {
$query->where('name', $request->star);
})->whereHas('studio', function ($query) use ($request) {
$query->where('name', $request->studio);
});
// studio and tag with no star
if (!$request->star && $request->tag && $request->studio)
$movies->whereHas('tags', function ($query) use ($request) {
$query->where('name', $request->tag);
})->whereHas('studio', function ($query) use ($request) {
$query->where('name', $request->studio);
});
// any one matches
if ($request->star || $request->tag || $request->studio)
$movies->whereHas('stars', function ($query) use ($request) {
$query->where('name', $request->star);
})->orWhereHas('tags', function ($query) use ($request) {
$query->where('name', $request->tag);
})->orWhereHas('studio', function ($query) use ($request) {
$query->where('name', $request->studio);
});
return response($movies->paginate(20));
}
【问题讨论】:
标签: php sql laravel eloquent laravel-8