Как получить данные на том же уровне?

#laravel

#laravel

Вопрос:

Я использую Laravel в бэкэнде и Vue во внешнем интерфейсе. В качестве библиотеки я использую DHTMLX Gantt.

Для подготовки задач я использую класс ресурсов.

У меня есть проект со многими проблемами. Наконец, мне нужны данные проекта на том же уровне, что и данные проблемы.

Что я пробовал:

Projectgantcontroller:

     public function index(Request $request, Project $project)
    {
        $tasks['project'] = new ProjectGanttResource($project);
        $tasks['issues'] = ProjectGanttResource::collection($project->issues);

        return response()->json( $tasks);
    }
  

Результат:

 {
    "project": {
        "id": 1,
        "text": "1. Projekt",
        "start_date": "14.10.2020",
        "duration": 10,
        "progress": 0.6
    },
    "issues": [
        {
            "id": 20000000,
            "text": 1. Issue,
            "start_date": "15.10.2020",
            "duration": 10,
            "progress": 0.6
        },
        {
            "id": 20000002,
            "text": 2. Issue,
            "start_date": "15.10.2020",
            "duration": 10,
            "progress": 0.6
        }

    ]
}
  

Что мне нужно, так это:

 {
    {
        "id": 1,
        "text": "1. Projekt",
        "start_date": "14.10.2020",
        "duration": 10,
        "progress": 0.6
    },
    {
        "id": 20000000,
        "text": 1. Issue,
        "start_date": "15.10.2020",
        "duration": 10,
        "progress": 0.6
    },
    {
        "id": 20000002,
        "text": 2. Issue,
        "start_date": "15.10.2020",
        "duration": 10,
        "progress": 0.6
    }
}
  

Я борюсь с массивами и объектами. Я пробовал разные подходы, но безуспешно.

Как мне подготовить данные для получения правильного результата?

Комментарии:

1. То, что вам нужно, не похоже на допустимый формат JSON.

Ответ №1:

Обе ваши модели обрабатываются одним и тем же ресурсом.
Таким образом, вы можете создать объединенную коллекцию и передать ее ресурсу.

Можете ли вы попробовать это :

 public function index(Request $request, Project $project) {
    return response()->json(
        ProjectGanttResource::collection(
            collect([$project])->merge($project->issues)
        )
    );
}
  

Если вам нужен разный ресурс для каждой модели, возможно, это сработает :
(можете попробовать прямо сейчас)

 public function index(Request $request, Project $project) {
    return response()->json(
        collect([$project])
            ->merge($project->issues)
            ->merge($project->todos)
            ->map(function ($object) {
                switch(get_class($object)) {
                    case 'AppModelsProject':
                        return new ProjectGanttResource($object);
                    case 'AppModelsIssue':
                        return new IssueGanttResource($object);
                    case 'AppModelsTodo':
                        return new TodoGanttResource($object);
                }
            })
    );
}
  

Комментарии:

1. Это работает! Но как я могу распространить его на задачи? Проблема имеет много задач.

2. ProjectGanttResource Обрабатываются ли задачи?

3. Нет, мне нравится создавать TodoGanttResource для обработки задач

4. Я думаю, мне нужен также отдельный ресурс для проблем

5. Отредактируйте ответ, но я могу попробовать это сейчас.

Ответ №2:

     public function index(Request $request, Project $project)
    {
        $projects = new ProjectGanttResource($project);
        $issues = IssueGanttResource::collection($project->issues);
        $allTodos = $project->issues->map(function ($issue, $key) {
            if(!empty($issue->todos)) {
                return $issue->todos;
            }
        });

        $todos = TodoGanttResource::collection($allTodos[0]);
        $tasks = collect([$projects])->merge($issues)->merge($todos);
        return response()->json($tasks);
    }