返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >ThinkPHP01:数据库和模型
  • 725
分享到

ThinkPHP01:数据库和模型

数据库phpmysql 2023-09-03 06:09:56 725人浏览 安东尼
摘要

ThinkPHP01:数据库和模型 一、开启调试模式二、配置文件三、URL解析四、数据库五、模型1. 定义模型2. 使用模型① 查询记录② 新增记录③ 删除记录④ 更新记录 3. 字段设

ThinkPHP01:数据库和模型

一、开启调试模式

  • 根目录会自带一个.example.env文件。把.example删掉即可开启调试模式。
  • .env中设置APP_DEBUG = true
  • 调试模式下,在页面右下角会出现Trace调试小图标。

在这里插入图片描述

二、配置文件

  • 配置文件有两种形式:.env用于本地开发测试;config用于部署上线。
  • 本地测试时,.env优先于config。部署上线时,.env会被自动忽略。
  • 获取配置:
    public function config() {    echo "env配置:" . env("database.hostname");    echo "
    "
    ; echo "config配置:" . config("database.connections.Mysql.hostname");}

三、URL解析

  • Thinkphp 默认单应用模式。
class Test {    // 控制器默认操作, Http://localhost:8000/test    public function index() {        return "index";    }    // http://localhost:8000/test/hello    public function hello() {        return "hello";    }    // http://localhost:8000/test/hello1?value=world    public function hello1($value = "") {        return "hello, ". $value;    }}
  • 修改默认的控制器文件目录,在config下的route.php中配置。

四、数据库

  • 查询整个表,当有前缀时使用 name(“member”)
use think\facade\Db;class DataTest {    public function index() {        $dbs = Db::table('member')->select();        return JSON($dbs);    }}
  • 单数据查询,find() 没有数据返回 null,findOrFail() 没有数据抛出异常, findOrEmpty() 没有数据返回空数组
public function index2() {    // 查询id为1    $dbs = Db::table('member')->where('id',1)->find();    // 查看sql语句    return Db::getLastSql();    return json($dbs);}
  • 数据集查询,select() 返回所有数据,selectOrFail() 没有数据抛出异常,toArray()将select() 后的数据集转化为刷组。
  • 其他查询,value() 返回某个字段,column() 返回某个字段的多个值,如果数据量过大使用chunk() 分批处理数据,或游标查询cursor()。
  • 同一个对象实例第二次查询会保留第一次查询的值,使用 removeOption() 可以清理掉上一次查询保留的值。
  • 新增数据,使用 insert() 返回影响行数,如果添加不存在的字段数据会抛出异常,如果强行新增不存在的字段使用 strick(false) 忽略异常,insertGetId() 获取插入的ID,insertAll() 插入多条数据,replace() 可以实现replace into,save() 可以判断是否新增或修改。
public function index3() {    $data = [        "name" => "k",        "age" => 12,        "email" => "@@@"    ];    return $this->memberTable->insert($data);}
  • 修改数据,使用update(),修改时执行函数操作使用 exp(),自增自减某个字段使用 inc()/dec(),使用 raw() 可以实现前面的所有操作。
  • 删除数据,使用delete(),默认根据主键删除。
  • 查询表达式,有 where()、whereLike()、whereBetween()、whereIn()、whereNull()。
  • 时间查询,有 where()、whereBetween()、whereBetweenTime()、whereTime()、whereYear()、whereMonth()、whereDay()、whereBetweenTimeField()。
  • 聚合查询,count()、max()、min()、avg()、sum()。子查询,fetchSql()、buildSql()、where闭包。原生查询,query()、execute()。
  • 链式查询,where()、whereRaw()、field()、fieldRaw()、withoutField()、alias()、limit()、page()、order()、orderRaw()、group()、having()。
  • 快捷查询,whereColumn()、whereXXX() XXX代表字段名、getByXXX()、getFieldByXXX()、when()、withAttr()。
  • 事务处理,transaction()、rollback()。

五、模型

1. 定义模型

  • 定义语法,对应数据库中的member表,大驼峰命名。
    use think\Model;class Member extends Model {}
  • 如果要在模型中指定模型名。
    use think\Model;class MemberModel extends Model {protected $name = 'member';}
  • 默认主键是 id,主动设置主键
    use think\Model;class MemberModel extends Model {protected $pk = 'uid';}
  • 类名默认对应表名,主动设置表
    use think\Model;class MemberModel extends Model {protected $table= 'member';}
  • 模型初始化,自动调用。
    use think\Model;class MemberModel extends Model {protected static function init(){parent::init();}}

2. 使用模型

  • 控制器中引入模型

    use \app\model\Member as MemberModel;

① 查询记录

  • Db门面的查询功能,模型都支持。
  • 所有记录
    use \app\model\Member as MemberModel;class Member {    public function index() {        $member = MemberModel::select();        $member = MemberModel::find(1);        return $member;    }}
  • 单条记录
    public function index() {    $member = MemberModel::find(1);    return $member;}

② 新增记录

  • 普通新增

    public function insert() {    // 新增方式1    $member = new MemberModel();    $member->name = "李白";    $member->age = 18;    $member->email = "@";    $member->save();    // 新增方式2    $member = new MemberModel();    $member->save([        'name' => "李黑",        'age' => 19,        'email' => "@"    ]);}
  • 验证新增,设置允许写入的字段

    $member->allowField(['name', 'age'])->save([    'name' => "李黑",    'age' => 19,    'email' => "@"]);
  • replace新增

    $member->replace()->save();
  • 新增成功后,获取自增的ID

    $member->id;
  • 批量新增

    $member = new MemberModel();$dataAll = [    [        'name' => "黑李",        'age' => 22,        'email' => "@"    ],    [        'name' => "白李",        'age' => 24,        'email' => "@"    ],];dump($member->saveAll($dataAll));
  • 使用静态方法 create(新增数组, 允许写入的字段, 是否replace),创建要新增的数据。

    $member = MemberModel::create([    'name' => "白李",    'age' => 24,    'email' => "@"], ['name', 'age'], true);echo $member->id;

③ 删除记录

  • 删除单个,默认根据主键删除。

    public function delete() {    // 成员方法删除    $member = MemberModel::find(1);    $member->delete();    // 静态方法删除    MemberModel::destroy(2);}
  • 批量删除

    MemberModel::destroy([3, 4, 5]);
  • 通过闭包删除

    MemberModel::destroy(function ($query){$query->where("age", "<", 10);});

④ 更新记录

  • 普通更新

    public function update() {    $member = MemberModel::find(8);    $member->name = "李四";    $member->age = 120;    $member->save();}
  • 强制更新

    $member->force()->save();
  • Db::raw() 执行SQL函数

    $member->age = Db::raw("age + 1");
  • allowField() 限制更新的字段(限制不了raw)。

  • saveAll() 批量更新,只能根据主键更新,返回被修改的数据集。

  • 静态方法update(数据数组, 限定记录, 限定字段)

    MemberModel::update([    'name' => "占山",    'age' => 15], ['id' => 10], ['name']);

3. 字段设置

  • 模型的数据字段对应表字段,默认严格区分大小写。

    class Member extends Model {// 是否严格区分大小写protected $strict = false;// 设置字段    protected $schema = [        "id" => 'int',        'name' => "string",        "age" => "int",        "email" => "string"    ];}
  • $schema属性只对模型有效。如果需要Db类也有效,config/database.php 开启字段缓存

    'fields_cache'    => true,
  • 在模型中处理数据

    class Member extends Model {    public function getMemberName($id) {        $data = $this->find($id);        return $data->getAttr('name');    }}

4. 模型获取器

  • 一个获取器对应模型中的一个特殊方法,该方法是public,方法名格式固定getXxxAttr()

  • 获取器的作用是对模型实例的数据做出自动处理。

    class Member extends Model {    // 获取器,获取数据时自动执行    public function getAgeAttr($value) {        if ($value < 18) {            return "未成年";        }else{            return "已成年";        }    }}
  • 如果定义了获取器,并且需要获取原始值,使用getData()

  • 动态获取器withAttr()

    public function index6() {    $var = MemberModel::select()->withAttr("email", function ($value) {        return strtoupper($value);    });    return json($var);}

5. 模型修改器

  • 修改器的作用是在新增、修改数据时对数据进行格式化、过滤等处理,方法名格式固定setXxxAttr()

  • 修改器只对模型操作有效,对Db类无效。

    class Member extends Model {    public function setEmailAttr($value) {        return strtoupper($value);    }}

6. 模型查询范围

  • 在模型中封装一个查询或写入的方法,方便控制器调用。方法名格式scopeXxx

    class Member extends Model {    public function scopeAdult($query) {        $query->where("age", ">=", 18)            ->field("id, name, age")            ->limit(3);    }}
  • 调用只需要后缀,查询范围只支持find和select。

    use \app\model\Member as MemberModel;class Member {    public function index7() {        $select = MemberModel::adult()->select();        return json($select);    }}
  • 全局查询范围,任何查询都需要加上这个范围。

    class Member extends Model {// 定义全局查询范围    protected $globalScope = ['status'];    public function scopeStatus($query) {        $query->where("status", 1);    }}

7. 模型数据集

  • 数据集继承于collection类。
  • 隐藏某个字段 hidden(),显示某个字段 visible(),添加获取器字段 append(),对字段进行函数处理 withAttr()

8. 模型的自动时间戳

  • 自动时间戳会自动写入create_time和update_time两个字段。默认值是int。

  • 全局开启自动时间戳,在config/database.php中设置

    'auto_timestamp'  => true,
  • 只想设置一个模型开启,在模型中设置

    protected $autoWriteTimestamp = true;
  • 自定义新增和修改的时间戳

    protected $createTime = "create_at";protected $updateTime = "update_at";
  • 不需要update_time

    protected $updateTime = false;

9. 模型的只读字段

  • 只读字段只支持模型,不支持数据库方式。

  • 只读字段在修改时无法被修改。

    protected $readonly = ['name','email'];
  • 动态设置只读字段。

    $member->readonly(['name','email'])->save();

10. 模型类型和转换

  • 类型转换会调用属性里的获取器等操作。

  • 设置类型转换可以在获取数据前将类型转换成需要的类型。

    protected $type = ['name' => 'string','price' => 'float',"create_time" => "datetime:Y-m-d"];
  • 当字段不再使用时,可以设置为废弃字段。

    protected $disuse = ['status', 'uid'];

11. 模型软删除

  • 软删除不会物理删除记录,相当于全局查询范围。

  • 在模型中设置软删除的功能。

    use think\model\concern\SoftDelete;class Member extends Model {    use SoftDelete;    protected $deleteTime = "delete_time";}
  • 取消屏蔽软删除

    UserModel::withTrashed()->select();
  • 显示被软删除的记录

    UserModel::onlyTrashed()->select();
  • 还原软删除 restore()

    $user = UserModel::onlyTrashed()->find(300);$user->restore();
  • 物理删除

    UserModel::onlyTrashed()->find(298)->force()->delete();

六、关联模型

1. 关联模型定义

  • 关联模型是将表与表之间进行关联和具象化,更高效的操作数据。

  • 主表关联附表(正向关联),hasOne(附表模型, 外键, 主键) 一对一关联,外键默认为主表名_id

    class profile extends Model {}class Member extends Model {    public function profile() {        return $this->hasOne(Profile::class);    }}
  • 附表关联主表(反向关联),belongsTo()

    class Profile extends Model {    public function member() {        return $this->belongsTo(Member::class, "user_id");    }}
  • 调用模型

    use app\model\Member as MemberModel;class Grade {    public function index() {        $member = MemberModel::find(1);        return $member->profile->hobby;    }}
  • 关联方式

    函数说明
    hasOne一对一
    belongsTo一对一
    hasMany一对多
    hasOneThrough远程一对一
    hasManyThrough远程一对多
    belongsToMany多对多
    morphMany多态一对多
    morphTo多态
  • 正反向关联

    说明正向关联反向关联
    一对一hasOnebelongsTo
    一对多hasManybelongsTo
    多对多belongsToManybelongsToMany
    远程一对多hasManyThrough\
    多态一对一morphOnemorphTo
    多态一对多morphManymorphTo

2. 一对一关联查询

  • 一对一关联修改

    $member = MemberModel::find(1);$member ->profile->save(['hobby' => '吃饭']);
  • 一对一关联新增

    $member = MemberModel::find(1);$member ->profile()->save(['hobby' => '吃饭']);
  • 正向关联反向操作

    $member = MemberModel::hasWhere("prefile", ["id" => 2])->find();

3. 一对多关联查询

  • has() 方法查询关联附表的主表内容。

    MemberModel::has("profile", ">=", 2)->select();
  • together() 可以在删除主表内容时,同时删除附表关联的内容。

    $member = MemberModel::with('profile')->find(2);$member->together(['profile'])->delete();
  • 新增和一对一关联新增相同。

4. 关联预载入

  • 关联预载入可以减少查询次数提高性能,但不支持多次调用。

    $list = MemberModel::with(['profile'])->select([19, 20, 21]);foreach ($list as $member) {dump($member->profile);}
  • 如果主表关联多个附表。

    $list = MemberModel::with(['profile', 'book'])->select([19, 20, 21]);foreach ($list as $member) {dump($member->profile.$member->book);}
  • 延迟预载入

    $list = MemberModel::select([19, 20, 21]);$list->load(['profile']);foreach ($list as $member) {dump($member->profile);}

5. 关联统计和输出

  • 统计主表在附表中有多少条记录,包括 withMax、withMin、withCount、withAvg等。

    public function index3() {    $list = MemberModel::withCount(['profile'])->select([1,2,3]);    foreach ($list as $member) {        echo $member->profile_count . '
    '
    ; }}
  • 关联统计输出采用 关联方法_统计方法

  • hiddenvisible控制隐藏和显示的字段,append添加额外字段。

    $list = MemberModel::withCount(['profile'])->select([1,2,3]);$list->hidden(['passWord', 'gender', 'profile.status']);

6. 多对多关联查询

  • 多对多中间表模型类 Pivot。

  • 在模型类中设置多对多关联,belongsToMany(关联模型, 中间表, 外键, 关联键)

    public function roles(){return $this->belongsToMany(Role::class, Access::class);}
  • 使用

    // 获取用户$member = MemberModel::find(2);// 获取用户权限$roles = $member->roles;
  • 新增,需要通过用户表新增到中间表关联。

    $member = MemberModel::find(2);$member->roles->save(Role::find(5));$member->roles->saveAll([1, 2, 3]);$member->roles->attach(5, ["detail" => "测试"]);
  • 删除中间表数据

    $member = MemberModel::find(2);$member->detach(5);

七、操作JSON

1. 数据库JSON

  • 在数据库中写入JSON,使用数组方式。用json()指定JSON字段。

    public function insert(){$data = ["name" => "张三","list" => ["nikeName" => "zs", "gender" => "女"]];return Db::name("user")->json(["list"])->insert($data);}
  • 查询数据,需要转换JSON,也需要设置json()

    Db::name('user')->json(["list"])->find(15);
  • 修改JSON字段

    $data["list"] = ["nikeName" => "zs", "gender" => "女"];Db::name("user")->json(['list']->where('id', 1)->update($data);$data["list->gender"] = "男";Db::name("user")->json(["lsit"])->where('id', 1)->update($data);

2. 模型JSON

  • 在模型中设置JSON字段

    protected $json = ["list"];
  • 模型中通过JSON的数据查询

    UserModel::where('list->name', "小红")->find();
  • 更新数据

    $user = UserModel::find(1);$user->list->name = "小黑";$user->save();

八、事件

  • 在执行增删改查的时候,可以触发一些事情来执行额外的操作。

1. 数据库事件

  • 数据库事件只支持 find、select、update、delete、insert。
  • 数据库实践方法为 Db::event('事件名', '执行函数')
事件名说明
before_selectselect查询前回调
before_findfind查询前回调
after_insertinsert操作成功后回调
after_updateupdate操作成功后回调
after_deletedalete操作成功后回调
  • 在控制器端,事件一般写在初始化方法里(继承于 BaseController)。

    use app\BaseController;use think\facade\Db;class Member extends BaseController {    public function initialize() {        Db::event("before_select", function ($query) {            echo "执行了批量查询";        });                Db::event("after_update", function ($query) {            echo "修改被执行";        });    }}

2. 模型事件

  • 模型支持的事件类型更丰富。
class Member extends Model {    protected static function onAfterRead($query){        echo "一条数据被查询";    }    protected static function onBeforeUpdate(Model $model) {        parent::onBeforeUpdate($model); // TODO: Change the autogenerated stub    }}

来源地址:https://blog.csdn.net/realoser/article/details/129532478

--结束END--

本文标题: ThinkPHP01:数据库和模型

本文链接: https://lsjlt.com/news/391651.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ThinkPHP01:数据库和模型
    ThinkPHP01:数据库和模型 一、开启调试模式二、配置文件三、URL解析四、数据库五、模型1. 定义模型2. 使用模型① 查询记录② 新增记录③ 删除记录④ 更新记录 3. 字段设...
    99+
    2023-09-03
    数据库 php mysql
  • 数据库:关系型数据库和非关系型数据库
    数据库是数据的结构化集合,可分为关系型数据库和非关系型数据库 关系型数据库更适合处理结构化数据;表与表之间有很复杂的关联关系。 大都遵循 SQL (结构化查询语言,Structured Query Language)标准。 常见的...
    99+
    2015-08-25
    数据库:关系型数据库和非关系型数据库
  • 定义数据模型&访问数据库
    定义数据模型一、Django定义数据模型在App中的models.py文件,数据库的表名称以类的形式来定义:[root@133 web]# cd /opt/python/dja...
    99+
    2024-04-02
  • laravel 从现有的数据库生成模型并通过模型操作数据库
    一:拓展安装 laravel中从现有的数据库生成模型并通过模型操作数据库需要使用到reliese/laravel拓展 reliese/laravel插件地址: https://packagist.org/packages/relie...
    99+
    2023-08-31
    laravel php Powered by 金山文档
  • Mysql数据库的数据模型有哪些?
    今天小编就为大家带来一篇介绍Mysql数据库的数据模型的文章。小编觉得挺实用的,为此分享给大家做个参考。一起跟随小编过来看看吧。层次模型层次模型是数据库系统最早使用的一种模型,它的数据结构是一棵“有向树”。...
    99+
    2024-04-02
  • mysql数据库属于哪种数据模型
    mysql数据库采用关系型数据模型,此模型包含以下概念:表:数据存储在称为表的结构中,由行和列组成。键:用于唯一标识表中每行的列或列组合。关系:通过外键建立表之间的连接,实现数据关联。此...
    99+
    2024-04-14
    mysql
  • 动态创建数据库模型
           在开发过程中,经常会由用户自主创建模型,然后添加模块内容,这种情况在cms中居多,所以我把几张常规的表给大家列出,帮助大家在以后的开发中可以参考该表来实现该功能。 一,Module表展示视图   module表数据字典...
    99+
    2015-04-04
    动态创建数据库模型
  • 数据库模型有哪三种
    这篇文章将为大家详细讲解有关数据库模型有哪三种,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是数据库?简单的说,数据库(英文Database)就是一个存放数据的仓库,...
    99+
    2024-04-02
  • redis是什么数据库模型
    Redis是一个开源的内存数据结构存储,支持诸多种数据结构,它是使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务的,因此不会产生并发问题,同时它具有内置的复制、Lua脚本、LRU清除、事务和不同级别的磁盘持久性,并通过Red...
    99+
    2024-04-02
  • 关系型数据库和非关系型数据库简介
    关系型数据库是基于关系模型提出来的数据库.那么什么是关系模型呢以行和列的方式二维表的方式存储数据的模型就是关系型数据库.例如:mysql和oracle非关系型数据库(NoSQL即Not-Only SQL)可...
    99+
    2024-04-02
  • 常见的数据库数据模型有哪些
    常见的数据库数据模型有哪些?针对这个问题,这篇文章给出了相对应的分析和解答,希望能帮助更多想解决这个问题的朋友找到更加简单易行的办法。当前常见的三种数据库数据模型是:层次模型、网状模型、关系模型。相关知识点...
    99+
    2024-04-02
  • 数据库中数据模型的实例分析
    数据库中数据模型的实例分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。数据模型可以说软件开发中最重要的部分,因为影响着我们的思考方式、解题思...
    99+
    2024-04-02
  • 数据库之关系模型介绍
    关系模型是一种用于描述和管理数据的概念模型,它通过定义实体、属性和实体之间的关系来组织数据。关系模型是数据库领域最为常用和广泛应用的...
    99+
    2023-09-21
    数据库
  • navicat数据库模型怎么连线
    连接数据库模型步骤:打开 navicat 并选择数据库类型。输入主机名、端口、用户名、密码和数据库信息。测试连接并保存。在导航器中查看已连接的模型。 Navicat 数据库模型连接指南...
    99+
    2024-04-24
    mysql navicat
  • Entity Framework Core基于数据模型创建数据库
    1.简介 使用Entity Framework Core构建执行基本数据访问的ASP.NET Core MVC应用程序。使用迁移(Migrations)基于数据模型创建数据库,你可以...
    99+
    2024-04-02
  • 实用数据库开发实践MySQL——数据模型
    目录 第1关 关系模型 关系型数据模型 关系模型基本术语 关系模型的数据操纵与完整性约束 数据操纵 完整性约束 关系模型优缺点 优点 缺点 实验 头歌实验代码 第2关 层次模型 层次型数据模型 层次模型的数据操纵与完整性约束 数据操纵 完整...
    99+
    2023-09-13
    mysql 数据库开发 数据库
  • 如何优化数据库的数据模型选择
    要优化数据库的数据模型选择,可以考虑以下几个方面: 数据规范化:将数据规范化可以减少数据冗余,提高数据的一致性和完整性。适当的规范化可以避免数据冗余和数据不一致的问题。 数据索引:为频繁查询的字段添加索引可以加快查询速度。但是要注意...
    99+
    2024-07-03
    数据库
  • 如何优化数据库的数据模型评估
    优化数据库的数据模型评估通常需要以下步骤: 数据收集:首先需要收集数据库的性能数据,包括数据量、访问频率、查询性能等方面的信息。 数据分析:对收集到的数据进行分析,找出数据库性能瓶颈和不足之处。 数据建模:根据数据分析的结果,重...
    99+
    2024-07-03
    数据库
  • 数据库 | 数据库概述、关系型数据库、非关系型数据库
    目录: 1.数据库:1.1 数据库的含义1.2 数据库的特点 2.数据表3.数据库管理系统4.数据库系统5.关系型数据库 和 非关系型数据库:5.1 关系型数据库5.2 关系型数据库“优...
    99+
    2023-09-05
    数据库 oracle mysql 关系型数据库 非关系型数据库
  • Cassandra的数据模型与关系型数据库有什么不同
    Cassandra的数据模型与关系型数据库有以下几点不同之处: 数据存储方式:Cassandra采用分布式的方式存储数据,数据按...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作