ThinkPHP增删改查接口实现
数据库连接配置
当.env文件中存在数据库配置时,这些配置会覆盖config/database.php中的相应配置。
通常在config/database.php中设置数据库连接的默认值或开发环境的值,并在.env文件中根据实际部署环境(如测试或生产环境)覆盖这些值。这样,你可以通过更改环境变量来调整配置,而无需修改代码中的配置文件,这有助于提高应用的安全性和灵活性。
数据库
CREATE TABLE `user` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键', `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户民', `email` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '邮箱', `created_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updated_at` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
出现问题,新建数据库时没设置charset字符集时,默认使用latin1出现的问题
#修改整个数据库字符集 ALTER DATABASE test CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; #只修改表字符集 ALTER TABLE user CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; #只修改列字符集 ALTER TABLE user CHANGE username username VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Model实体类
在app/model下面新建UserModel实体类
<?php namespace app\model; use think\Model; class User extends Model { // 数据表名(数据库中的表名是user) protected $table = 'user'; // 主键 protected $pk = 'id'; // 设置字段信息 protected $schema = [ 'id' => 'int', 'username' => 'string', 'email' => 'string', 'created_at' => 'datetime', 'updated_at' => 'datetime', ]; }
Controller(ORM操作数据库)
<?php namespace app\controller; use app\BaseController; use app\model\User; use think\Request; class UserController extends BaseController { // 获取用户列表 public function index() { $users = User::where('status', 1) ->where('age', '>', 25) ->whereOr('name', 'Jane') ->whereIn('city', ['New York', 'Los Angeles', 'Chicago']) ->select(); return json($users); } // 创建用户 public function save(Request $request) { $data = $request->param(); $user = User::create($data); return json($user); } // 获取指定用户信息 public function read($id) { $user = User::find($id); if ($user) { return json($user); } else { return json(['error' => '读取失败,用户不存在'], 404); } } // 更新用户信息 public function update(Request $request, $id) { $data = $request->param(); $user = User::find($id); if ($user) { $user->save($data); return json($user); } else { return json(['error' => '更新失败,用户不存在'], 404); } } // 删除用户 public function delete($id) { $result = User::destroy($id); if ($result) { return json(['message' => '删除成功']); } else { return json(['error' => '删除失败,用户不存在'], 404); } } }
新增
修改
ID查询单条数据
删除
列表查询所有数据
关联查询
model设置映射
namespace app\model; use think\Model; //UserCity为中间表 class UserCityModel extends Model { // 设置当前模型对应的完整数据表名称 protected $table = 'user_city'; // 定义与 CityModel 的关联 public function city() { return $this->belongsTo(CityModel::class, 'cityid', 'id'); } }
controller使用映射
namespace app\controller; use app\model\UserCityModel; class UserCityController { public function index($uid) { // 查询 user_city 表中 userid 为 $uid 的记录,并关联 city 表获取 cityname $result = UserCityModel::with(['city' => function($query) { $query->field('id, cityname'); // 选择 city 表中需要的字段 }])->where('userid', '=', $uid)->select(); // 将结果返回或输出 return json($result); } }
查询出来会以city为key的对象展示
不使用model关联直接leftjoin
namespace app\controller; use think\facade\Db; use think\facade\View; class UserCityController { public function index($uid) { // 使用 leftJoin 查询 user_city 和 city 表,并根据 userid 获取对应的 cityname $result = Db::table('user_city') ->alias('uc') ->leftJoin('city c', 'uc.cityid = c.cityid') ->where('uc.userid', '=', $uid) ->field('uc.*, c.cityname') ->select(); // 将结果返回或输出 return json($result); } }
Controller(原生sql非ORM)
<?php namespace app\controller; use think\facade\Db; use think\Request; use think\Response; class User2Controller { //查询所有信息 public function list() { $users = Db::query('SELECT * FROM user ', []); if ($users) { return json($users); } else { return json(['message' => 'User not found']); } } // 创建用户 public function create(Request $request) { $username = $request->param('username'); $email = $request->param('email'); //$password = md5($request->post('password')); // 为了示例简单,这里使用md5加密,实际应用中请使用更安全的加密方式 $result = Db::execute('INSERT INTO user (username, email) VALUES (?, ?)', [$username, $email]); if ($result) { return json(['message' => 'User created successfully']); } else { return json(['message' => 'Failed to create user']); } } // 获取用户信息 public function read($id) { $user = Db::query('SELECT * FROM user WHERE id = ?', [$id]); if ($user) { return json($user); } else { return json(['message' => 'User not found']); } } // 更新用户信息 public function update(Request $request, $id) { $username = $request->param('username'); $email = $request->param('email'); $result = Db::execute('UPDATE user SET username = ?, email = ? WHERE id = ?', [$username, $email, $id]); if ($result) { return json(['message' => 'User updated successfully']); } else { return json(['message' => 'Failed to update user']); } } // 删除用户 public function delete($id) { $result = Db::execute('DELETE FROM user WHERE id = ?', [$id]); if ($result) { return json(['message' => 'User deleted successfully']); } else { return json(['message' => 'Failed to delete user']); } } }
新增
修改
查询
删除
列表
路由配置
在route/app.php文件中定义路由规则,以便API能够响应HTTP请求
// 用户路由 Route::rule('user/<action>', 'UserController/<action>'); Route::rule('user2/<action>', 'User2Controller/<action>'); //或者根据请求逐个定义url Route::post('user', 'UserController/create'); Route::get('user/:id', 'UserController/read'); Route::put('user/:id', 'UserController/update'); Route::delete('user/:id', 'UserController/delete'); //可以用这个兜底,所有controller的方法名以Ajax结尾的自动匹配url Route::any('<controller>/<action>Ajax', '<controller>/<action>Ajax'); //如果用文件夹包含起来,需要添加文件夹前缀访问 Route::any(':folder/<controller>/<action>Ajax', '/:folder.<controller>/<action>Ajax');