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类

  • 定义
  • 增删改查
  • 聚合操作
  • 自动完成
  • 时间戳
  • 软删除