一、模型
之前开发一个功能,后端为在控制器(C)中写 php + SQL,前端为在页面(V)中写html + css + js,这就形成了 VC 架构。
但是发现,相同的数据逻辑(SQL)在不同的功能中可能被用到,所以可以把数据逻辑(SQL)单独提出来作为模型层(M),多个业务逻辑(php)可以复用。
(https://www.optbbs.com/forum.php?mod=viewthread&tid=12613221)
2. 模型的作用
2.1 方便数据校验和过滤
在应用开发中,比如表单提交等,经常需要对数据进行校验和过滤。thinkphp6的模型支持数据的校验和过滤,可以帮助开发者避免许多数据处理方面的问题。
2.2 便于代码重用和维护
在许多场景下,不同的功能需要实现相同的业务逻辑。使用模型,开发人员可以在一个地方实现相同的业务逻辑,提高了代码的重用性和维护性。
二、模型文件里的定义方法
注意:不要和 thinkphp 方法一样名称
1. 模型的名字
假设有一个table的名字为test,则模型的名字为Test
一个模型对应一个数据表,规则:驼峰式的
2. 新增一个模型文件Test.php
第一步:在 test 项目中创建目录,目录名:model
第二步:在 model 创建 Test.php 文件
第三步:Test.php 文件中引入think\Model
第四步:Test.php 文件中类的名字也为Test
三、增
模型文件
比如增加一个用户
public function doAddUser(){
// 返回新增的对象
$user = Test::create([
'name' => 'shi',
'age' => 26
]);
// 自增的id
echo $user->id;
return $user;
}
2. 控制器中调用模型
在test\controller中新建一个控制器文件,ModelTest.php
ModelTest.php中引入模型文件app\test\model\Test
public function addUser(){
$Test = new Test();
$result = $Test->doAddUser();
print($result);
}
3. 运行
四、查
模型文件
比如查年龄大于18岁的用户
public function doGetUser(){
# 返回结果集
$users = Test::where('age','>=',18)->select();
return $users;
}
2. 控制器文件
public function getUser(){
$Test = new Test();
$results = $Test->doGetUser();
print($results);
}
3. 运行
五、改
模型文件
比如修改年龄大于18岁的用户的年龄为40
public function doUpdateUser(){
$user = Test::where('name', 'shi')
->where('age', '>=', 18)
->find();
print($user);
$user->age = 40;
// 返回影响的记录数
$result = $user->save();
print($user);
return $result;
}
2. 控制器文件
public function updateUser(){
$Test = new Test();
$results = $Test->doUpdateUser();
print($results);
}
3. 运行
注:如果是要修改name字段,是修改不成功的,因为其与 “think\Model” 中的属性name冲突。建表时注意字段尽量避免使用 “think\Model” 中的属性。
https://blog.csdn.net/u013288190/article/details/132643809
六、删
模型文件
比如删除name为shi的所有用户
public function doDeleteUser(){
# 删除方法,返回删除的个数
$delete = Test::where('name', 'shi')->delete();
return $delete;
}
2. 控制器文件
public function deleteUser(){
$Test = new Test();
$result = $Test->doDeleteUser();
print($result);
}
3. 运行
七、模型的能力
1. 模型中也可以使用Db库
如
Db::name('user')->where('id','>',10)->select();
改成模型操作的话就变成
User::where('id','>',10)->select();
2. 除了代码复用,模型提供了获取器、修改器、搜索器、模型事件等功能
如,获取器的场景包括:
时间日期字段的格式化输出;
集合或枚举类型的输出;
数字状态字段的输出;
组合字段的输出;
例如,数据库中存储的状态是-1,0,1等数字,但是可以通过模型统一向外提供转换
- namespace app\model;
-
- use think\Model;
-
- class User extends Model
- {
- public function getStatusAttr($value)
- {
- $status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核'];
- return $status[$value];
- }
- }
请参考官方教程
https://www.kancloud.cn/manual/thinkphp6_0/1037588
八、参考:
https://blog.csdn.net/2301_76809965/article/details/130353013
https://blog.51cto.com/u_15067267/4677537
https://www.php.cn/faq/591280.html
https://cloud.tencent.com/developer/article/2138957
https://m.php.cn/faq/511616.html
软件工程小施同学
20230904