1、Model的命名规范
一般model的名字和表名是对应的,例如
表名 pre_user -> 模型名 User.php User 表名 pre_user_info -> 模型名 UserInfo.php User
一般一个表对应一个model类,model类里面是对这个表的增删改查的各种操作
2、Model使用
四种调用模型的方法
$res = User::get(1) $user = new User; $res = $user::get(1); $user = Loader::model("User"); $res = $user::get(1); $user = model("User); $res = $user::get(1); $res->toArray() # 抽象对象数组化
具体使用示例
<?php namespace app\index\model; use think\Model; class User extends Model { }
<?php namespace app\index\controller; use think\controller; use think\Loader; use app\index\model\User; class Index { public function index(){ # User类对象 推荐 $res = User::get(1); # User实例对象 // $user = new User; // $res = $user::get(5); # loader use think\Loader; // $res = Loader::model("User"); // $res = User::get(2); # 助手函数model // $user = model("User"); // $res = $user::get(4); $res = $res->toArray(); //将结果转换成数组 dump($res); } }
3、模型查询数据
# get 获取一条记录 $res = Student::get(1); $res = Student::get(function ($query) { $query->where('id', 1) ->field('name', 'age'); }); $res = $res->toArray(); # all 获取多条记录 $res = Student::all('1, 2, 3'); $res = Student::all([1, 2, 3]); $res = Student::all(function ($query) { $query->where('id', '>', 1) ->field('name', 'age'); }); foreach ($res as $val){ $val = $val->toArray(); //将结果转换成数组 dump($val); } # find 查询某一条 $res = Student::where('id', '=', '1') ->field('name') ->find(); $res = $res->toArray(); # select 多条查询 $res = Student::where('id', '>=', '1') ->field('name') ->limit(2) ->order('id DESC') ->select(); foreach ($res as $val){ $val = $val->toArray(); //将结果转换成数组 dump($val); } # value 按字段查询一条 $res = Student::where('id', '>=', '1') ->value('name'); # column 返回字典 name->age $res = Student::where('id', '>=', '1') ->column("age","name");
4、模型添加数据
# create方式 返回对象 $res = Student::create([ 'name'=>'王大锤', 'age' => 23, 'email'=>'123456@qq.com' ], ['name', 'age'] ); $res->id; # 实例化方式 $student = new Student; $student->name = '王大锤'; $student->age = 23; $student->save(); # 实例化方式过滤插入字段,返回插入行数 $student = new Student; $data = [ 'name' => '王大锤', 'age' => 23, 'email' => '123456@qq.com' ]; $res = $student->allowField(['name', 'age']) ->save($data); dump($res); # saveAll添加多条数据 返回对象列表 $student = new Student; $data = [ [ 'name' => '王大锤', 'age' => 23, 'email' => '123456@qq.com' ], [ 'name' => '王二锤', 'age' => 23, 'email' => '123456@qq.com' ] ]; $res = $student->allowField(['name', 'age']) ->saveAll($data); dump($res);
5、模型更新数据
# update 返回影响行数 推荐 $res = Student::where(['id'=>5]) ->update([ 'name'=>'Jack' ]); # update 第二个参数是条件,返回更新的对象 $res = Student::update( ['name'=>'Jack'] , ['id'=>6]); # update 第二个参数可以是闭包函数 返回更新对象 $res = Student::update( ['name'=>'Jack'] , function ($query){ $query->where('id', '=', 7); }); # save 保存模型对象 返回影响行数 $student = Student::get(1); $student->name = 'MImi'; $res = $student->save(); # save->where方式,第二个参数为条件,返回影响行数 $student = new Student; $res = $student->save([ 'name' => 'Yami' ], ['id' => 1]); # save-闭包函数方式,第二个参数为条件,返回影响行数 $student = new Student; $res = $student->save([ 'name' => 'Yami' ], function ($query){ $query->where('id', '>', 1); }); # 批量更新 数据中要含有主键,返回更新对象列表 $student = new Student; $res = $student->saveAll([ ['id'=>1, 'name' => 'MIMI'], ['id'=>2, 'name' => 'MIMI'] ]);
6、模型删除数据
# 传入主键,返回影响行数 $res = Student::destroy(1); # 传入条件,返回影响行数 $res = Student::destroy(['id'=>2]); # 传入闭包函数条件,返回影响行数 $res = Student::destroy(function ($query){ $query->where('id', '<', '5'); }); # 获取对象删除 返回影响行数 $student = Student::get(6); $res = $student->delete(); # 条件删除 返回影响行数 '1=1'清空数据 $res = Student::where(['id'=>5]) ->delete();
7、模型聚合数据
# 初始化数据库, 准备测试数据 $data = []; for ($i = 0; $i < 10; $i++) { $data[] = [ 'name' => "student$i", 'age' => 10 + $i ]; } $student = new Student(); $student->saveAll($data); # count sum avg max min $res = Student::count(); $res = Student::where('id', '>', 3) ->count();
8、模型修改器和自动完成
将数据库存储的数值型数据转换为字符串
auto (新增及更新的时候自动完成的属性数组)
insert(仅新增的时候自动完成的属性数组)
update(仅更新的时候自动完成的属性数组)
读取器的命名规范是 -> get + 属性名的驼峰命名 + Attr
修改器的命名规范是 -> set + 属性名的驼峰命名 + Attr
定义
<?php namespace app\index\model; use think\Model; class Student extends Model { # 新增及更新 自动完成 protected $auto = [ 'time' ]; # 新增 自动完成 protected $insert = [ 'insert_time' ]; # 更新 自动完成 protected $update = [ 'update_time' ]; # 获取器 public function getSexAttr($val) { switch ($val) { case 1: return '男'; case 2: return '女'; default: return '未知'; } } # 修改器 public function setPasswordAttr($val) { return md5($val); } public function setTimeAttr() { return time(); } public function setInsertTimeAttr() { return time(); } public function setUpdateTimeAttr() { return time(); } }
使用
# 新增 $res = Student::create([ 'name' => 'tom', 'age' => 23, 'sex' => 2, 'password' => '123457' ]); # 修改 $student = Student::where(['id' => 1])->find(); $student->sex = 2; $res = $student->save(); # 转为数组 dump($student->toArray());
9、模型时间和软删除
(1)模型时间
配置文件中设置
"auto_timestamp" => true # 一般不开启这个功能
Model中设置
# 默认字段update_time create_time protected $autoWriteTimestamp = True; // 开启自动时间戳 protected $createTime = 'create_time'; // 可自定义时间字段名 protected $updateTime = 'update_time'; // 关闭 false
使用
# 创建记录 自动完成 create_time 字段 $res = Student::create([ 'name' => 'tom', 'age' => 23, 'sex' => 2, 'password' => '123457' ] ); # 更新记录 自动完成 update_time 字段 $student = Student::where(['id' => 1])->find(); $student->sex = 2; $res = $student->save();
(2)软删除
开启软删除
<?php namespace app\index\model; use think\Model; use traits\model\SoftDelete; class Student extends Model { use SoftDelete; protected $deleteTime = 'delete_time'; }
使用
# 软删除 $res = Student::destroy(1); $res = Student::get(1); // NULL # 查询已删除的数据 $res = Student::withTrashed(true)->find(1); # 查询仅包含已删除的数据 $res = Student::onlyTrashed()->select(); foreach ($res as $val) { dump($val); } # 恢复被软删除的数据 update delete_time=NULL # 彻底删除数据 $res = Student::destroy(1,true); # 通过get方式进行软删除/删除 $student = Student::get(3); $student->delete();//软删除 $res = $student->delete(true);//删除
总结
Db类
增删改查
条件构造器
闭包函数实现where条件
链式操作
Model类
定义
增删改查
聚合操作
自动完成
时间戳
软删除