Я экспериментирую с созданием Restful API в Laravel и использую функцию ресурсов, предназначенную для вывода API. Я создал следующие модели:
Книга, Автор и Категория. Я также создал ресурс для каждой из этих моделей.
Между автором и книгой существует отношение один ко многим, а между категорией и книгой - множество ко многим, у которого есть сводная таблица.
Я могу легко вернуть коллекцию всех книг со следующими данными:
return BookResource::collection(Book::with(['author', 'categories'])->paginate(10));
Но я хочу легко фильтровать по автору и категории, поэтому я реализовал это следующим образом в моем контроллере:
public function index(request $request)
{
//if no filer params are passed in return all books with author and categories
if (!$request->has('author') && !$request->has('category')) {
return BookResource::collection(Book::with(['author', 'categories'])->paginate(10));
}
//author param is passed in
if($request->has('author') && !$request->has('category')){
$authorName = $request->author;
return BookResource::collection(Book::whereHas('author', function ($query) use ($authorName) {
$query->where('name', $authorName);
})->get());
}
//category param is passed in
if(!$request->has('author') && $request->has('category')){
$categoryName = $request->category;
return BookResource::collection(Book::whereHas('categories', function ($query) use ($categoryName) {
$query->where('name', $categoryName);
})->get());
}
}
Есть ли более эффективный способ вернуть коллекцию BookResource, отфильтрованную по автору и категории?