Фильтрация коллекций ресурсов Laravel - лучший способ - PullRequest
0 голосов
/ 01 мая 2019

Я экспериментирую с созданием 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, отфильтрованную по автору и категории?

1 Ответ

0 голосов
/ 01 мая 2019

Пожалуйста, попробуйте реализовать этот способ. Надеюсь это поможет. Спасибо.

public function index(){
$author = request ('author', null);
$category = request ('category', null);

$books = Book::with(['author', 'categories'])->when($author, function ($query) use ($author) {
 return $query->whereHas('author', function ($query) use ($author){
  $query->where('name', $author);
});
})->when($category, function ($query) use ($category) {
return $query->whereHas('categories', function ($query) use ($category) {
   $query->where('name', $category);
   });
})->paginate(10);
return BookResource::collection($books);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...