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
PHP技术探究:优化数据库查询效率的实用方法
本文将深入探讨PHP中优化数据库查询效率的实用方法,包括索引优化、SQL语句优化以及缓存机制的应用。通过合理的优化策略和技巧,可以显著提升系统性能,提高用户体验,是PHP开发者不容忽视的重要议题。
|
3天前
|
SQL Java 数据库连接
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
9 0
|
8天前
|
存储 监控 安全
PHP医院安全(不良)事件报告系统源码 vue2+element支持11大类不良事件上报、审核处理、分析改进
医院安全(不良)事件管理系统采用无责的、自愿的填报不良事件方式,有效地减轻医护人员的思想压力,实现以事件为主要对象,可以自动、及时、实际地反应医院的安全、不良、近失事件的情况,更好地掌握不良事件的发生趋势,为及时采取适当的管理措施和流程、制度改进提供了良好的量化依据。系统通过汇集不同类型事件的报告,从中分析出医院内部潜在的问题和风险,将发生的事故降到最低,从而保证病人安全和医护人员安全。
20 0
|
12天前
|
PHP 数据库
DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务-2
DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务
|
12天前
|
存储 PHP Apache
DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务-1
DIY私人图床:使用CFimagehost源码自建无需数据库支持的PHP图片托管服务
|
12天前
|
安全 关系型数据库 MySQL
【PHP开发专栏】PHP PDO与MySQLi操作数据库
【4月更文挑战第30天】PHP数据库交互的核心是PDO和MySQLi。PDO提供数据访问抽象层,支持多种数据库,强调安全和灵活性;MySQLi则专为MySQL设计,有面向对象和过程化接口。两者都支持预处理语句,防止SQL注入。选择取决于项目需求,如可移植性、特定功能和API偏好。了解其使用有助于编写安全高效的代码。
|
12天前
|
关系型数据库 MySQL PHP
【PHP 开发专栏】PHP 连接 MySQL 数据库的方法
【4月更文挑战第30天】本文介绍了 PHP 连接 MySQL 的两种主要方法:mysqli 和 PDO 扩展,包括连接、查询和处理结果的基本步骤。还讨论了连接参数设置、常见问题及解决方法,如连接失败、权限和字符集问题。此外,提到了高级技巧如使用连接池和缓存连接信息以优化性能。最后,通过实际案例分析了在用户登录系统和数据管理中的应用。
|
13天前
|
API 数据库 Python
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
Python web框架fastapi数据库操作ORM(二)增删改查逻辑实现方法
|
13天前
|
SQL 缓存 PHP
【PHP开发专栏】PHP数据库查询优化技巧
【4月更文挑战第29天】本文探讨了PHP数据库查询优化技巧,包括数据库设计的规范化与反规范化,合理使用索引,优化查询逻辑,以及避免SELECT *。在SQL查询优化中,利用EXPLAIN分析查询、优化JOIN操作和子查询,以及改进WHERE条件。PHP层面的优化涉及预处理语句、缓存查询结果、分页查询优化和异步处理。此外,还提到了高级技术如数据库分区、读写分离和分布式数据库。通过这些方法,开发者能提升查询效率,优化应用性能和用户体验。
|
13天前
|
SQL 关系型数据库 MySQL
【PHP开发专栏】PHP与数据库交互入门
【4月更文挑战第29天】本文介绍了PHP与数据库交互的基础,包括选择MySQL或PostgreSQL等关系型数据库,使用MySQLi或PDO扩展进行连接。示例展示了如何使用PHP连接数据库,如MySQLi的面向对象连接方式和PDO的多数据库支持。此外,还讲解了执行SQL查询(如SELECT、INSERT、UPDATE、DELETE)的操作,并强调了安全性与错误处理,如使用预处理语句防止SQL注入。通过学习,读者可掌握PHP操作数据库的基本技能。