繁体   English   中英

来自 PHP 中许多表的嵌套 json 响应

[英]Nested json response from many tables in PHP

到目前为止,我可以使用 laravel 调用 API。

我的数据库中有 2 个不同的views

我有view_project_percentageview_projtask

view_project_percentage是包含项目详细信息的项目列表。

view_projtask是每个项目的任务列表

比如说。

如果我的view_project_percentage3 projects

喜欢

ProjCodeABC1,ABC2, ABC3

并在我的view_projtask

我有

2 task for ProjectCode ABC1

1 task for ProjectCode ABC2

3 task for ProjectCode ABC3

现在我要做的是获得这样的 json 数组响应

 [
{
    "id": 9,
    "proj_code": "ZQQKVOTRJJNZ",
    "proj_title": "P12",
    "proj_desc": "Project Description 12",
    "target_man_days": 1000000,
    "issue": 0,
    "report": 1,
    "total_employee": 3,
    "hours_8": "4",
    "hours_6": "0.0",
    "hours_3": "0",
    "total_weight_progress": "5.00",
    "est_start_date": "2020-01-20 09:42:00",
    "est_end_date": "2020-01-20 21:42:00",
    "act_start_date": "2020-01-20 09:42:00",
    "act_end_date": "2020-01-20 21:42:00",
    "longitude": "121.07642460",
    "latitude": "14.56055010",
    "location": "Pasig, Metro Manila, Philippinae",
    "status": null,
    "deleted": 0,
    "by_id": 7,
    "updated_by": "Keigh Dee",
    "created_at": "2020-01-20 09:42:31",
    "updated_at": "2020-01-22 14:01:08",
    {
       "taskCode": "J5X1FHCMVFSQ",
       "total_task_weight": null,
       "taskWeight": "50.00",
       "plan_days": "5",
       "actual_days": "5",
       "task_title": "Task 5",
       "task_desc": "Description 5",
       "taskDeleted": 0,
        "view_projtask_deleted": 0
    },
    {
        "taskCode": "FZPRFIWOKBFQ",
        "total_task_weight": "5.00",
        "taskWeight": "25.00",
        "plan_days": "5",
        "actual_days": "5",
        "task_title": "Task 2",
        "task_desc": "Description 2",
        "taskDeleted": 0,
        "view_projtask_deleted": 0
   }
},

........so on

正如您在我的示例 json 响应中看到的那样,我有

1 project with 2 tasks

这是我的工作代码

public function get_all_projtask()
{
    $proj_query = "SELECT a.id, a.proj_code, a.proj_title, a.proj_desc, a.target_man_days, a.issue, a.report, a.total_employee, a.hours_8, a.hours_6, a.hours_3,
    a.total_weight_progress, a.est_start_date, a.est_end_date, a.act_start_date, a.act_end_date, a.longitude, a.latitude, a.location, a.status, a.deleted, 
    a.by_id, a.updated_by, a.created_at, a.updated_at, b.taskCode, b.total_task_weight, b.taskWeight, b.plan_days, b.actual_days, b.task_title, b.task_desc, b.taskDeleted, b.deleted as view_projtask_deleted

    FROM `view_projtask` AS b LEFT JOIN `view_project_percentage` AS a ON b.projCode = a.proj_code";

    $proj = DB::connection('mysql')->select($proj_query);

    if(count($proj)){
        return $proj;
    }else{
        return response([
            'status'=>'bad',
            'message'=>'No record found'
            ]);
    }
}

我在这里的查询只是从view_projtask获取每个特定项目的所有任务

我正在尝试做一个 json 响应,以唯一地获取所有项目列表,并且在该项目的 json 中包含多个任务

我的view_projtask

在此处输入图片说明

我的view_project_percentage

在此处输入图片说明

更新

这是我当前的 api 输出

[
{
    "id": 9,
    "proj_code": "ZQQKVOTRJJNZ",
    "proj_title": "P12",
    "proj_desc": "Project Description 12",
    "target_man_days": 1000000,
    "issue": 0,
    "report": 1,
    "total_employee": 3,
    "hours_8": "4",
    "hours_6": "1.0",
    "hours_3": "0",
    "total_weight_progress": "5.00",
    "est_start_date": "2020-01-20 09:42:00",
    "est_end_date": "2020-01-20 21:42:00",
    "act_start_date": "2020-01-20 09:42:00",
    "act_end_date": "2020-01-20 21:42:00",
    "longitude": "121.07642460",
    "latitude": "14.56055010",
    "location": "Pasig, Metro Manila, Philippinae",
    "status": null,
    "deleted": 0,
    "by_id": 7,
    "updated_by": "Keigh Dee",
    "created_at": "2020-01-20 09:42:31",
    "updated_at": "2020-01-22 14:01:08",
    "taskCode": "OKIX19IR1DST",
    "total_task_weight": null,
    "taskWeight": "25.00",
    "plan_days": "5",
    "actual_days": "5",
    "task_title": "Task 1",
    "task_desc": "Description 1",
    "taskDeleted": 0,
    "view_projtask_deleted": 0
},
{
    "id": 9,
    "proj_code": "ZQQKVOTRJJNZ",
    "proj_title": "P12",
    "proj_desc": "Project Description 12",
    "target_man_days": 1000000,
    "issue": 0,
    "report": 1,
    "total_employee": 3,
    "hours_8": "4",
    "hours_6": "1.0",
    "hours_3": "0",
    "total_weight_progress": "5.00",
    "est_start_date": "2020-01-20 09:42:00",
    "est_end_date": "2020-01-20 21:42:00",
    "act_start_date": "2020-01-20 09:42:00",
    "act_end_date": "2020-01-20 21:42:00",
    "longitude": "121.07642460",
    "latitude": "14.56055010",
    "location": "Pasig, Metro Manila, Philippinae",
    "status": null,
    "deleted": 0,
    "by_id": 7,
    "updated_by": "Keigh Dee",
    "created_at": "2020-01-20 09:42:31",
    "updated_at": "2020-01-22 14:01:08",
    "taskCode": "FZPRFIWOKBFQ",
    "total_task_weight": "5.00",
    "taskWeight": "25.00",
    "plan_days": "5",
    "actual_days": "5",
    "task_title": "Task 2",
    "task_desc": "Description 2",
    "taskDeleted": 0,
    "view_projtask_deleted": 0
},
{
    "id": 9,
    "proj_code": "ZQQKVOTRJJNZ",
    "proj_title": "P12",
    "proj_desc": "Project Description 12",
    "target_man_days": 1000000,
    "issue": 0,
    "report": 1,
    "total_employee": 3,
    "hours_8": "4",
    "hours_6": "1.0",
    "hours_3": "0",
    "total_weight_progress": "5.00",
    "est_start_date": "2020-01-20 09:42:00",
    "est_end_date": "2020-01-20 21:42:00",
    "act_start_date": "2020-01-20 09:42:00",
    "act_end_date": "2020-01-20 21:42:00",
    "longitude": "121.07642460",
    "latitude": "14.56055010",
    "location": "Pasig, Metro Manila, Philippinae",
    "status": null,
    "deleted": 0,
    "by_id": 7,
    "updated_by": "Keigh Dee",
    "created_at": "2020-01-20 09:42:31",
    "updated_at": "2020-01-22 14:01:08",
    "taskCode": "J5X1FHCMVFSQ",
    "total_task_weight": null,
    "taskWeight": "50.00",
    "plan_days": "5",
    "actual_days": "5",
    "task_title": "Task 5",
    "task_desc": "Description 5",
    "taskDeleted": 0,
    "view_projtask_deleted": 0
},
{
    "id": 8,
    "proj_code": "SUZ82OJI091M",
    "proj_title": "P1",
    "proj_desc": "Project Description 1",
    "target_man_days": 10000,
    "issue": 0,
    "report": 0,
    "total_employee": 2,
    "hours_8": "1",
    "hours_6": "0.5",
    "hours_3": "0",
    "total_weight_progress": null,
    "est_start_date": "2020-01-20 09:41:00",
    "est_end_date": "2020-01-20 21:41:00",
    "act_start_date": "2020-01-20 09:41:00",
    "act_end_date": "2020-01-20 21:41:00",
    "longitude": "121.07642460",
    "latitude": "14.56055010",
    "location": "Pasig, Metro Manila, Philippinae",
    "status": null,
    "deleted": 0,
    "by_id": 7,
    "updated_by": "Keigh Dee",
    "created_at": "2020-01-20 09:41:29",
    "updated_at": "2020-01-20 09:41:29",
    "taskCode": "J5X1FHCMVFSQ",
    "total_task_weight": null,
    "taskWeight": "50.00",
    "plan_days": "5",
    "actual_days": "5",
    "task_title": "Task 5",
    "task_desc": "Description 5",
    "taskDeleted": 0,
    "view_projtask_deleted": 0
},

如果您考虑使用 eloquent(您确实应该这样做),则这些表的模型应如下所示:

class Project extends Model
{
    protected $table = "view_project_percentage";

    public function tasks()
    {
        return $this->hasMany(ProjectTask::class, 'projCode', 'proj_code');
    }
}

class ProjectTask extends Model
{
    protected $table = "view_projtask";

    public function project()
    {
        return $this->belongsTo(Project::class, 'projCode', 'proj_code');
    } 
}

然后你需要在你的控制器中:

public function get_all_projtask()
{   
    return response()->json(Project::with('tasks')->get());
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM