Как фильтровать объекты внутри массива с помощью ресурса Laravel - PullRequest
0 голосов
/ 16 июня 2020

У меня есть практическое приложение Laravel, которое отображает учебные курсы. Чтобы упростить использование, я хочу использовать категории, поэтому, если вы хотите увидеть курсы кулинарии, вы можете нажать «/ Categories / Cooking» и увидеть все кулинарные курсы.

Итак, у меня есть свои модели и таблицы и отношения установлены. Если я запускаю:

return Category::with('courses')->where('slug','=',$slug)->firstOrFail();

, я получаю:

[
    {
        "id": 1,
        "title": "Course 5",
        "description": "Ipsa ad quae optio dolorum et nesciunt nulla. Libero illum a quam provident alias sapiente. Omnis debitis quasi eius nihil enim. Ut saepe explicabo hic est rerum molestiae est. Iusto voluptatem aut non voluptatem qui fuga inventore. Et sit blanditiis amet fugit doloremque.",
        "cost": 1209,
        "slug": "autem-aspernatur-rerum-cumque-commodi-est-et",
        "category_id": 5,
        "created_at": "2020-06-16T13:09:56.000000Z",
        "updated_at": "2020-06-16T13:09:56.000000Z",
        "short_description": "Quod odit nam quisquam ab sint.",
        "length": 1,
        "pivot": {
            "category_id": 2,
            "course_id": 1
        }
    },
    {
        "id": 2,
        "title": "Course 3",
        "description": "Veniam voluptates velit veniam eum distinctio eum praesentium sed. Ad molestiae ea voluptatem aut velit ab. Voluptatum non ut facilis autem ducimus excepturi. Sit eum aperiam aut eos.",
        "cost": 1077,
        "slug": "iusto-doloremque-repellat-repellat-illo-rerum-libero",
        "category_id": 5,
        "created_at": "2020-06-16T13:09:56.000000Z",
        "updated_at": "2020-06-16T13:09:56.000000Z",
        "short_description": "Sint dolores omnis aut repudiandae quis.",
        "length": 1,
        "pivot": {
            "category_id": 2,
            "course_id": 2
        }
    }
]

Теперь, очевидно, мне не нужно все это для моего представления, где пользователь просто выбирает курс. Мне нужен только заголовок и слизняк. Итак, я создал Ресурс для фильтрации всего:

public function toArray($request)
    {
        return [
            'id' => $this->id,
            'course_title' => $this->courses->title,
            'course_slug' => $this->courses->slug
        ];
    }

и в контроллере:

return new CategoryShowResource(Category::with('courses')->where('slug','=',$slug)->get());

Но это вызывает исключение:

"message": "Property [id] does not exist on this collection instance.",

Затем это произошло мне, что Курсы находятся внутри массива. Итак, если я сделаю:

 $category = Category::with('courses')->where('slug','=',$slug)->firstOrFail();
 return $category->courses[0]->title;

Конечно, я просто получу

Course 5

Вопрос в том, как использовать Ресурс для фильтрации того, что я хочу, учитывая, что это не похоже хотите поиграть с массивом Courses?

Ответы [ 3 ]

0 голосов
/ 17 июня 2020

Почему бы вам просто не сделать select более избирательным. Если вы используете with( ), вы можете сделать это с помощью чего-то вроде

return Category::with('courses'=>function($query){
    $query->select('id','title', 'slug');
  })
)->where('slug','=',$slug)->firstOrFail();

Или для L5.5

return Category::with('courses:id, title, slug')->where('slug','=',$slug)->firstOrFail();

Проверить похожий пост

0 голосов
/ 21 июня 2020

Нашёл ответ на это. Решение - использовать что-то вроде

'courses' => $this->courses->map->only('title','slug')
0 голосов
/ 16 июня 2020

попробуйте сначала получить категорию, а затем передать курсы в функцию сбора

$category = Category::with('courses')->where('slug','=',$slug)->get();
return CategoryShowResource::collection($category->courses);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...