1.定义
<?php
namespace app\index\model;
use think\Model;
/**
* 一般数据模型都是和表名一致
*/
class User extends Model{ }
2.一般model的名字和表名是对应的,例如
表名 pre_user -> 模型名 User.php
表名 pre_user_info -> 模型名 UserInfo.php
3.表名和数据模型定义名不一致需要额外定义
class User extends Model
{
// 设置相关的数据表
protected $table = "admin_user";
}
4.种调用模型的方法
//先导入定义的数据模型类
use \app\index\model\User;
(1) $res = User::get(1)
(2) $user = new User;
user::get(1);
(3) use think\Loader;
$user = Loader::model("User");
user::get(1);
(4) $user = model("User);
user::get(1);
查询
get 获取一条记录
$res = Student::get(1);
all 获取多条记录
$res = Student::all('1, 2, 3');
$res = Student::all([1, 2, 3]);
find 查询某一条
$res = Student::where('id', '=', '1')
->field('name')
->find();
select 多条查询
$res = Student::where('id', '>=', '1')
->field('name')
->limit(2)
->order('id DESC')
->select();
value 按字段查询一条
$res = Student::where('id', '>=', '1')
->value('name');
注: res->toArray();//将结果转换成数组
查询数目
# count sum avg max min
$res = Student::count();
$res = Student::where('id', '>', 3)
->count();
添加
简单的添加
$res = Student::create([
'name' => 'tom',
'age' => 23,
'sex' => 2,
'password' => '123457'
]);
实例化方式
$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);
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);
更新
update 返回影响行数 (推荐)
$res = Student::where(['id'=>5])
->update([
'name'=>'Jack'
]);
// score 字段加 5
Student::where(['id'=>5])->setInc('score', 5);
// score 字段减 5
Student::where(['id'=>5])->setDec('score',5);
批量更新 数据中要含有主键,返回更新对象列表
$student = new Student;
$res = $student->saveAll([
['id'=>1, 'name' => 'MIMI'],
['id'=>2, 'name' => 'MIMI']
]);
删除
传入主键,返回影响行数
$res = Student::destroy(1);
传入条件,返回影响行数
$res = Student::destroy(['id'=>2]);
条件删除 返回影响行数
$res = Student::where(['id'=>5])
->delete();
事务回滚
(1)自动控制事务处理
Db::transaction(function(){
Db::table('think_user')->find(1);
Db::table('think_user')->delete(1);
});
(2)手动控制事务
Db::startTrans(); //启动事务
try {
AgentSetting::where('id',$id)->setInc('number',1);
Db::commit(); //提交事务
} catch (Exception $e) {
Db::rollback(); //回滚
return json(['code'=>'0','error'=>$e->getMessage()]);
}
模型修改器和自动完成
auto (新增及更新的时候自动完成的属性数组)
insert(仅新增的时候自动完成的属性数组)
update(仅更新的时候自动完成的属性数组)
读取器的命名规范是 -> get + 属性名的驼峰命名 + Attr
修改器的命名规范是 -> set + 属性名的驼峰命名 + Attr
- 定义
<?php
namespace app\index\model;
use think\Model;
class Student extends Model
{
# 新增及更新 自动完成
protected $auto = ['sex'];
# 新增 自动完成
protected $insert = ['insert_time'];
# 更新 自动完成
protected $update = ['update_time'];
# 获取器
public function getSexAttr($val)
{
switch ($val) {
case 1:
return '男';
case 2:
return '女';
default:
return '未知';
}
}
# 修改器
public function setTimeAttr()
{
return time();
}
public function setInsertTimeAttr()
{
return time();
}
}
- 调用
$res = Student::create([
'name' => 'tom',
'age' => 23,
'sex' => 2,
'password' => '123457'
]);
自动更新时间
在数据库配置文件中设置
// 自动写入时间戳字段
'auto_timestamp' => true,
自动操作字段
Model中设置
# 默认字段update_time create_time
protected $autoWriteTimestamp = True; // 开启自动时间戳
protected $createTime = 'create_time'; // 可自定义时间字段名
protected $updateTime = 'update_time'; // 关闭 false
注:当创建和更新数据时,数据的create_time和update_time字段会被写入操作的时间
软删除
在数据库配置文件中设置
// 自动写入时间戳字段
'auto_timestamp' => true,
开启软删除
<?php
namespace app\index\model;
use think\Model;
use traits\model\SoftDelete;
class Student extends Model
{
use SoftDelete;
protected $deleteTime = 'delete_time';
}
调用
Student::where(['id'=>5])->delete();//软删除
Student::where(['id'=>5])->delete(true);//真正删除
查询已软删除的数据
$res = Student::withTrashed(true)->find(1);
查询仅包含已软删除的数据
$res = Student::onlyTrashed()->select();