PHP:ThinkPHP5数据库操作增删改查-Model类

简介: PHP:ThinkPHP5数据库操作增删改查-Model类

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类


定义

增删改查

聚合操作

自动完成

时间戳

软删除

相关文章
|
2月前
|
存储 SQL 关系型数据库
PHP与数据库交互:从基础到进阶
【10月更文挑战第9天】在编程的世界里,数据是流动的血液,而数据库则是存储这些珍贵资源的心脏。PHP作为一门流行的服务器端脚本语言,其与数据库的交互能力至关重要。本文将带你从PHP与数据库的基本连接开始,逐步深入到复杂查询的编写和优化,以及如何使用PHP处理数据库结果。无论你是初学者还是有一定经验的开发者,这篇文章都将为你提供宝贵的知识和技巧,让你在PHP和数据库交互的道路上更加从容不迫。
|
4月前
|
SQL NoSQL 关系型数据库
实时数仓Hologres发展问题之实时数仓的类数据库化与HTAP数据库的差异如何解决
实时数仓Hologres发展问题之实时数仓的类数据库化与HTAP数据库的差异如何解决
62 2
|
27天前
|
SQL 存储 BI
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
|
2月前
|
前端开发 Java 数据库连接
javamvc配置,增删改查,文件上传下载。
【10月更文挑战第4天】javamvc配置,增删改查,文件上传下载。
42 1
|
2月前
|
存储 NoSQL API
使用Py2neo进行Neo4j图数据库的增删改查操作
使用Py2neo进行Neo4j图数据库的增删改查操作
114 5
|
2月前
|
数据可视化 API PHP
低代码开发工具-学生管理系统-老师管理增删改查实现
低代码开发工具-学生管理系统-老师管理增删改查实现
45 5
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
3月前
|
SQL 关系型数据库 MySQL
学成在线笔记+踩坑(3)——【内容模块】课程分类查询、课程增改删、课程计划增删改查,统一异常处理+JSR303校验
课程分类查询、课程新增、统一异常处理、统一封装结果类、JSR303校验、修改课程、查询课程计划、新增/修改课程计划
学成在线笔记+踩坑(3)——【内容模块】课程分类查询、课程增改删、课程计划增删改查,统一异常处理+JSR303校验
|
2月前
|
JavaScript 前端开发 测试技术
[新手入门]todolist增删改查:vue3+ts版本!
【10月更文挑战第15天】[新手入门]todolist增删改查:vue3+ts版本!
|
3月前
|
SQL 关系型数据库 MySQL
ThinkPHP6 连接使用数据库,增删改查,find,select,save,insert,insertAll,insertGetId,delete,update方法的用法
本文介绍了在ThinkPHP6框架中如何连接和使用数据库进行增删改查操作。内容包括配置数据库连接信息、使用Db类进行原生MySQL查询、find方法查询单个数据、select方法查询数据集、save方法添加数据、insertAll方法批量添加数据、insertGetId方法添加数据并返回自增主键、delete方法删除数据和update方法更新数据。此外,还说明了如何通过数据库配置文件进行数据库连接信息的配置,并强调了在使用Db类时需要先将其引入。
ThinkPHP6 连接使用数据库,增删改查,find,select,save,insert,insertAll,insertGetId,delete,update方法的用法