#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);
}