一般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类
- 定义
- 增删改查
- 聚合操作
- 自动完成
- 时间戳
- 软删除