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类

  • 定义
  • 增删改查
  • 聚合操作
  • 自动完成
  • 时间戳
  • 软删除
相关文章
|
SQL PHP 数据库
PHP:ThinkPHP5数据库操作增删改查-Db类
PHP:ThinkPHP5数据库操作增删改查-Db类
192 0
PHP:ThinkPHP5数据库操作增删改查-Db类
|
存储 PHP 数据库
PHP:ThinkPHP5数据库操作增删改查-Model类
PHP:ThinkPHP5数据库操作增删改查-Model类
141 0
|
SQL 关系型数据库 MySQL
|
关系型数据库 MySQL PHP
|
关系型数据库 MySQL API
PHP数据库操作:从MySQL原生API到PDO
本文将举详细例子向大家展示PHP是如何使用`MySQL原生API`、`MySQLi面向过程`、`MySQLi面向对象`、`PDO`操作MySQL数据库的。
2184 0
|
SQL 关系型数据库 MySQL
常用的PHP数据库操作方法(MYSQL版)
常用的PHP数据库操作方法(MYSQL版) 作者: 字体:[增加 减小] 类型:转载 时间:2011-06-08   最近一直在折腾自己的网站首页,写的大部分PHP脚本都要用到和MYSQL数据库相关的操作,今天把这些方法和大家分享一下,希望大家能多多交流!     一、数据库操作 1.
1118 0
|
Web App开发 关系型数据库 MySQL
php涉及数据库操作时响应很慢。
症状描述: 网站是php开发的,大部分页面响应很慢。 本地开发时响应速度很快,但是部署到生产环境后大部分响应很慢。   通过谷歌浏览调试发现PHP页面加载很慢,有个别的php请求的响应时间甚至超过10秒,php请求的处理都不是很复杂,不该这么慢。
1184 0
|
SQL 关系型数据库 MySQL
php pdo mysql数据库操作类
原文:php pdo mysql数据库操作类   findAll(array( 'field'=>'ID,albumName,albumImage, mainActor,directors,tags,info,area, keywords,wflag,year,mod_versi...
1308 0
|
SQL 关系型数据库 PHP
PHP学习笔记(2)--PHP数据库操作基本知识
  1.PHP和MySQL连接 php.ini 加载mysql组件:     extension=php_mysql.
949 0