ThinkPHP 数据库操作

1. 前言

本小节介绍如何使用 ThinkPHP 框架对数据库进行增删该查操作,并且实现几个和学生信息表相关的接口来加深对路由 POSTGETDELETEPUT 的理解。

MySQL 中的 selectdeleteupdateinsert 就分别对应着 ThinkPHP 中的 select()delete()update()insert() 方法,使用者只需要按照某种规范和格式书写代码,框架底层会自动帮你生成对应的 SQL 语句然后交给 MySQL 这样的数据库执行并返回结果。

2. 新建数据模型

首先在 app 目录下新建一个 Models 目录,然后在 Models 目录下新建一个 Study 目录,在 Study 目录新建模型 CourseModelStudentModelTeacherModelStudentCourseModel,新建 CourseModel模型如下图所示:
图片描述

Tips: 模型类需要继承 think\Model 类,$table = 'course' 表示该模型表名 course,可以按照上面的方法新建其他几个模型。

3. 添加学生数据接口

3.1 定义路由

首先在 study.php 路由文件添加 POST 路由如下图所示:
图片描述

Tips: post 表示添加数据,客户端调用该接口必须使用 POST 请求方式,路由指向的控制器是 app\controller\Study\StudentController,方法名是 addStudent()

3.2 新建控制器

接下来在 app\controller\Study\ 目录中添加 StudentController 控制器如下图所示:
图片描述

3.3 定义路由指向的方法

下面定义一下路由里面指向的 addStudent() 方法,方法如下:

<?php
namespace app\controller\Study;
use app\BaseController;
use app\Models\Study\StudentModel;

class StudentController extends BaseController
{
    /**
     * 添加学生接口
     */
    public function addStudent()
    {
        //接收请求过来的姓名字段
        $name = (string)$this->request->param('name');
        //接收请求过来的年龄字段
        $age = (int)$this->request->param('age');
        //接口请求过来的身份证字段
        $id_number = (string)$this->request->param('id_number');

        try {
            $student = new StudentModel();
            $student->name = $name;
            $student->age = $age;
            $student->id_number = $id_number;
            $student->created_at = time(); //时间戳,表示数据入库时间
            $student->status = 1;
            $student->save();
        } catch (\Exception $exception) {
            return json("学生数据入库失败" . $exception->getMessage(), 404);
        }
        return json("添加成功");
    }
}

Tips: 其中 $student = new StudentModel() 表示实例化 StudentModel 模型类,然后给这个模型类的属性赋值,使用模型类的 save() 方法就可以向 student 表添加数据了,注意实例化模型类之后给模型对象属性赋值需要和数据库字段保持一致。

3.4 请求接口添加学生数据

如下图所示,可以在 postman 请求上述定义好的学生添加接口,并且带上需要添加的参数字段,字段名需要个上面接收的一致:

{
    "name" : "爱因诗贤",
    "age" : 18,
    "id_number" : "42011720100512065X"
}

请求如下图所示:
图片描述
添加成功之后就可以在数据库表中查看到新增的学生数据了:
图片描述

4. 获取学生接口

4.1 定义路由

上面已经定义好了学生相关的控制器,获取学生接口只需要定义路由和方法即可,路由定义如下图所示:
图片描述

4.2 定义方法

下面定义一下路由里面指向的 getStudent() 方法,方法如下:

    // 获取单个学生信息
    public function getStudent()
    {
        $student_id = (int)$this->request->param('student_id');
        if (!$student_id) {
            return json('参数不合法', 404);
        }
        //查询单条数据
        $student = StudentModel::where('id', $student_id)->where('status', 1)->find();
        if (empty($student)) {
            return json('学生信息不存在', 404);
        }
        //把时间戳转化为可读的日期格式
        $student->created_at = date("Y-m-d H:i", $student->created_at);
        return json($student);
    }

Tips: 其中 where('id',$student_id) 表示使用 id=$student_id 查询,find() 方法表示查询单条。

4.3 请求接口获取学生信息

如下图所示,可以在 postman 请求上述定义好的获取,并且带上需要添加的参数字段,字段名需要个上面接收的一致:
图片描述

5. 修改学生信息接口

5.1 定义路由

上面已经定义好了学生相关的控制器,获取学生接口只需要定义路由和方法即可,路由定义如下图所示:
图片描述

5.2 定义方法

下面定义一下路由里面指向的 updateStudent() 方法,方法如下:

    // 修改学生信息接口
    public function updateStudent()
    {
        $student_id = (int)$this->request->param('student_id');
        //接收请求过来的姓名字段
        $name = (string)$this->request->param('name');
        //接收请求过来的年龄字段
        $age = (int)$this->request->param('age');
        //接口请求过来的身份证字段
        $id_number = (string)$this->request->param('id_number');
        if (!$student_id) {
            return json('参数不合法', 404);
        }
        //查询单条数据
        $student = StudentModel::where('id', $student_id)->where('status', 1)->find();
        if (empty($student)) {
            return json('学生信息不存在', 404);
        }
        try {
            $student->name = $name;
            $student->age = $age;
            $student->id_number = $id_number;
            $student->update_at = time(); //时间戳,表示数据更新时间
            $student->save();
        } catch (\Exception $exception) {
            return json("学生数据修改失败" . $exception->getMessage(), 404);
        }
        return json("更新成功");
    }

Tips: 此时 save() 方法表示的是更新数据,只需要复制被更新的字段。

5.3 请求接口修改学生信息

如下图所示,可以在 postman 请求上述定义好的获取,并且带上需要添加的参数字段,字段名需要个上面接收的一致:
图片描述

更新成功之后就可以在数据库表中查看到新修改的学生数据了:
图片描述

6. 删除学生接口

6.1 定义路由

上面已经定义好了学生相关的控制器,获取学生接口只需要定义路由和方法即可,路由定义如下图所示:
图片描述

6.2 定义方法

下面定义一下路由里面指向的 deleteStudent() 方法,方法如下:

    // 删除学生
    public function deleteStudent()
    {
        $student_id = (int)$this->request->param('student_id');
        if (!$student_id) {
            return json('参数不合法', 404);
        }
        //查询单条数据
        $student = StudentModel::where('id', $student_id)->where('status', 1)->find();
        if (empty($student)) {
            return json('学生信息不存在', 404);
        }
        $student->status = 2;
        $student->save();
        return json("删除成功");
    }

Tips: 此时 save() 方法表示的是更新数据,并且删除是用的 软删除

6.3 请求接口删除学生

如下图所示,可以在 postman 请求上述定义好的获取,并且带上需要添加的参数字段,字段名需要个上面接收的一致:
图片描述

更新成功之后就可以在数据库表中查看到被 软删除 的学生数据了:
图片描述

7.小结

本小节介绍了如何新建一个数据库模型类,然后分别定义了学生信息相关的增删改查接口,分别对应了 POSTDELETEPUTGET 请求方式,接口地址相同,但是请求方式不同,会请求到不同指定的方法处理不同的事情。

Tips: 代码仓库:https://gitee.com/love-for-poetry/tp6