ThinkPHP数据库与模型

数据库连接器与查询构造器

总结:同之前版本相比,ThinkPHP5的数据库操作对底层进行优化设计,对各种操作进行了高级封装。既可以直接使用连接器进行高效的原声查询,也可以使用封装好的查询构造器进行直观便捷的查询,为模型操作打下了基础。

连接数据库

配置方法:

1.静态连接:应用/模块中的数据库配置文件database.php
2.动态连接:入口类Db.php中的connect(参数(数组和字符串))方法
动态配置连接字符串:mysql://root:1234@localhost:3306/thinkphp#utf8
数据库类型://用户名:密码@数据库地址:数据库端口/数据库名#字符集

总结:操作数据库的第一步就是数据库的连接,TP5提供了强大灵活的连接方式,特别是惰性链接支持,极大提高了连接效率(db()助手函数不支持),使用户的关注重点放在业务逻辑上,不必担心连接问题。
原生SQL查询

Connection类
1.query(sql语句字符串,[参数绑定]):读操作,select。
2.execute(sql语句字符串,[参数绑定]):写操作,insert,update,delete。
Connection类实例通过入口类Db静态自动调用,不用显示写出。
参数绑定:防止SQL注入,用命名占位符进行参数绑定。
//1.查询操作:工资大于4000元的员工信息,用命名占位符进行参数绑定$sql = "select name,salary,dept from staff where salary > :salary";$result = Db:query($sql,['salary'=>4000]);
//2.更新操作,将id=1004的记录,salary增加1000$sql = "update staff set salary = salary+1000 where id=:id";Db::execute($sql,['id'=>'1004']);
//3.插入操作:默认添加到表的尾部的$sql = "insert into staff (name,sex,age) values (:name,:sex,:age)";Db::execute($sql,['name'=>'Alert','sex'=>1,'age'=>33]);
//4.删除操作:id=1010的记录$sql = "delete from staff where id=:id";Db::execute($sql,['id'=>1010]);

总结:因为数据只能识别并运行原生SQL语句,所以对于数据库的一切查询操作,最终都要归结到原生查询。包括后面要学到的,利用查询构造器来进行增删改查操作,最终仍是调用连接类Connection对应方法完成。
查询构造器工作原理与链式操作

1.查询构造器的工作原理?



2.什么是链式操作?为什么要用链式操作?



3.数据表的查询条件是如何生成的?
table,field,where

4.如何用查询构造器实现数据表的增删改查(CURD)操作?
查询条件生成的三种方法


新增与更新操作
1.新增

insert(['字段'=>'值'])
insert(['二维数组'])

2.更新

update(['字段'=>'值'])
setInc/setDec('字段',步长)

查询与删除操作
1.读取

find(主键)
select(主健)

2.删除

delete(主键)
delete(true)

总结:查询条件的调用次序是生成SQL条件的次序,推荐使用闭包,来生成查询条件,不仅功能强大,而且便于扩展。
模型入门知识
1.什么是模型,有什么用?

模型是对实体的抽象描述,快速直观的展示出实体的特征。

2.模型类中有哪些属性和方法

1)模型类的属性和方法需要在基类Model.php;
2)Model.php类位于public/library/think/Model.php;
3)该类是一个抽象类,不能被实例化,必须由子类继承并实现内部全部抽象方法。

模型的创建与使用方法
1.模型于数据表的对应关系
2.模型与数据表的区别与联系

区别
分工不同:Db类负则数据表的访问,模型专注于业务逻辑处理
返回值不同:Db访问返回数组,模型操作返会对象
联系
模型最终仍需调用Db类完成数据表的查询操作

3.如何创建模型

1.手工创建:在哟ing用或模块下创建模型目录model,并在该目录下创建与数据表同名的类文件:如User.php对应user.dbf表;
2.命令创建:在当前项目目录下,用命令:php think make:model模块名/模型名,会自动创建指定位置和命名空的空模型,并自动与数据表绑定;
php think make:model index/student
3.模型创建完成后,会自动获取当前数据表名称$table,表中所有字段信息$field,主键$pk和数据库配置信息$connection。同时会自动继承基类Model中所有属性和方法,protected类型在本模型中使用,public类型还可以在控制器使用,静态方法大多直接用在控制器,进行CURD操作。

4.如何在控制器调用模型

1)实例化调用:
用new生成模型对象;
用模型对象处理相关业务;
2)静态调用:
通过静态查询直接将一个空模型转为数据模型;
再调用相关方法完成增删改查操作;
3)不推荐使用助手函数model()和添加模型类后缀

5.模型数据访问的方式
模型访问方式

控制器访问(外部):用模型对象:$model;
模型访问(内部):用伪对象变量:$this;

通过模型和表中添加数据

1.什么是CURP操作?



2.Create创建数据



1)数据创建过程可以触发很多操作,非Db操作可比;
2)静态调用的实质其实仍是实例化调用,只是将CURD方法进行静态封装;

3)saveAll()方法实际上是通过多次执行insert语句完成,很少用到;
4)理论上讲,通过模型向表中添加数据,尽可能都采用静态方式。

通过模型更新表中的数据

1)不允许无条件更新,必须设置更新条件;
2)可以将更新条件,如主键写在更新数据中,方法可以自动识别;
3)更新条件可以使用闭包,完成更复杂的业务逻辑。

通过模型来查询表中的数据

1.ORM模型(对象关系映射)
ThinkPHP5实现了基于ActiveRecords模式的ORM模型



2.Read读取操作



1)原则来说,查询都应该采用静态查询方法;
2)尽可能采用get()和all()方法代替find()和select();
3)牢记一条原则:一个模型对象实例应该唯一对应数据表的一条记录;
通过模型来删除表中记录

1)delete()方法不要传任何参数,它只删除当前模型对象对应的记录;
2)destory()中的删除条件,推荐采用闭包方式;
3)推荐用软件删除替代该方法,即用更新的方式来实现删除操作。

模型读取器和修改器设置方法

1.模型的读取器
触发条件:当用模型对象读取表中字段的时候;
应用场景:日期时间字段,集合或枚举数据,数字状态与文本转换,字段拼装;
设置位置:在模型中设置,访问属性通常为protected,不允许外部直接访问;
方法名称:get属性名称Attr($name,$data=[])。



2.模型修改器
触发条件:当用模型对象向数据表中心增记录或更新字段值的时候;
应用场景:日期时间字段,集合或枚举数据,数字状态与文本转换,字段瓶装;
设置位置:在模型中设置,访问属性通常为protected,不允许外部直接访问;
方法名称:set属性名称Attr($name,$data=[])。


修改器的工作原理图
总结:模型的获取器与修改器,是模型中最常用的自定义方法,配合后面要学习的验证器,可以让用户更安全的读取数据表中的数据。
模型数据类型转换属性

类型转换


总结:通过配置属性值的方式,来完成写入数据的类型自动转换,比用修改器和读取器更加灵活方方便。如果数据处理逻辑不复杂,推荐使用这种方式来替代传统的读取器和修改器方法。
ThinkPHP数据库与模型(原文地址

结束。


你们的支持也是我前进的动力,非常感谢支持!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,001评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,210评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,874评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,001评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,022评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,005评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,929评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,742评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,193评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,427评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,583评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,305评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,911评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,564评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,731评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,581评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,478评论 2 352

推荐阅读更多精彩内容