【实战】Tp5+小程序(一)--数据库访问与ORM

摘要

ThinkPHP5 从入门到深入学习,结合实战项目深入理解 ThinkPHP5 的特性和使用方法,了解 ThinkPHP5 的数据库访问和 ORM 思想,学习使用查询构造器、日志以及初步了解异常处理机制。

7.2 从一个错误了解 Exception 的继承关系

1.将Exception修改为全局Exception基类,而不是think\Exception

`think\Exception => \Exception =>  Throwable`
`HttpException => \RuntimeException =>  \Exception =>  Throwable`

当访问的控制器不存在、url 错误时,属于 HttpException 异常。 而原先定义的render()recordErrorLog()方法要求接收的参数类型是think\Exception,由于HttpException不是继承于think\Exception,不能转化为think\Exception,所以会报错。

解决:使用全局 Exception 基类后,既支持 HttpException,又支持 think\Exception。子类可以自动被转化为父类的类型。 Exception 基类是所有异常类的基类。

2.补充:PHPStrom 快捷键:

  • ctrl+alt+O => 快速删除没有 use 的类

7.3 TP5 数据库中间层架构解析

7.4 查询构造器一

1、为什么不使用原生的查询语句而使用查询构造器?

  • 简洁方便
  • 对不同数据库的操作进行了封装,使用统一的数据库操作标准

2、对查询构造器的理解

  • 查询构造器不仅仅是对数据库进行读操作,还包括数据库的写操作
  • 查询构造器仅仅是语法,最终都是通过 Builder 翻译成 SQL 语句来执行

7.5 查询构造器二

1.查询语句 = 链式方法 + 执行方法

2.链式方法:

  • where
  • whereOr
  • field

只会返回 Query 对象,不是查询结果

3.执行方法:

  • find
  • select
  • update
  • delete
  • insert 4.在执行方法调用前,查询状态是保留的,直到调用执行方法后,状态才会被清除

7.6 查询构造器三

1.链式方法说明(where):

where(‘字段名’,‘表达式’,‘查询条件’)

2.三种实现方式:

  • 表达式
  • 数组法(不够灵活,且存在一定的安全问题)
  • 闭包(最灵活)
// 通过use来使用外部的数据
where(function ($query) use ($id){
    $query->where('banner_id', '=', $id)
})

7.7 开启 SQL 日志记录

1.database.php =》 debug=true

2.config.php =》 app_debug=true

3.config.php =》 log =》 level =》sql

'log'                    => [
     日志记录方式,内置 file socket 支持扩展
    'type'  => 'File',
     日志保存目录
    'path'  => LOG_PATH,
     日志记录级别
    'level' => ['error', 'sql'],
],

不在配置文件中开启日志

ExceptionHandler=>recordErrorLog 方法中开启日志仅仅在发生异常时写入。

所以对于全局的情况,将日志手动添加到入口文件中,对所有调用都开启 sql 日志

??这样和在配置文件中开启日志有什么区别?

7-8 ORM 与模型

1.ORM 理解:

ORM = Object Relationship Map

对象关系映射:将每张数据表看作是一个对象

2.模型(TP5 模型)–ORM 实现的具体机制 => 业务的集合= 数据库查询+业务逻辑+...

【注】模型与数据表不是一一对应的关系,简单的业务逻辑看上去是一张表对应一个模型,但复杂的业务逻辑(需要分层)可能是横跨多个表。

模型不仅仅只是 model 这一层,复杂的业务还可以继续划分,tp5 中有 model(数据层,细),service(服务层,粗),logic(逻辑层)

7-9 初识模型

1.model/Banner.php 继承 Model 类之后,就成为了模型,就可以使用模型类已经封装好的方法(get),而不用自定义方法(getBannerById)。

$banner = BannerModel::getBannerById($id);
 // => 返回数组
 //等价于
$banner = BannerModel::get($id);
// => 返回对象,便于处理查询结果

2.tp5 自动将对象序列化,序列化的格式根据配置文件中的配置项default_return_type转化为相应的格式。

// config.php
'default_return_type' => 'html'

3.自定义模型方法(getBannerById)调用的是指定的数据表,而模型类自动的方法(get)调用的是模型类名对应的数据表。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏coding

vim实用笔记

20320
来自专栏debugeeker的专栏

《coredump问题原理探究》windows版6.1节无成员变量的类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

8330
来自专栏MasiMaro 的技术博文

8086cpu中的标志寄存器与比较指令

在8086CPU中有一个特殊的寄存器——标志寄存器,该寄存器不同于其他寄存器,普通寄存器是用来存放数据的读取整个寄存器具有一定的含义,但是标志寄存器是每一位都有...

16710
来自专栏安恒网络空间安全讲武堂

二进制学习系列-格式化字符串got

加上运行过后整体了解到有一块检测登陆用户和三个模块函数,一个是编写文件'put',一个是显示文件'dir',还有一个是读取文件'get'。

46310
来自专栏calmound

ZOJ 2724 Windows Message Queue(优先队列)

优先队列的概念及使用方法 题意:输入GET,队列为空则输出空,否则输出最优先的数据(所谓最优先,就是优先值最小的一个),若输入PUT,输入三个数据,分别是名字,...

38150
来自专栏vue

C++项目中采用CLR的方式调用C#编写的dll

1、注意事项:在编写C#DLL类库时,最好不要出现相同的命名空间,否则在C++中调用可能会出现编译错误。 2、将C#的源码生成的“dll”文件复制到C++项目中...

33430
来自专栏技术最杂谈

map容器clear操作不会释放内存?

当第一次听到这个说法的时候确实有点惊讶。一直记得map容器底层红黑树会自动析构节点,并释放内存。在同事进行了代码验证,并百度了答案后,我也变得不确定起来了。

1.5K80
来自专栏Java编程技术

UML建模(时序图)

时序图是一种强调消息时序的交互图,他由对象(Object)、消息(Message)、生命线(Lifeline)和Combined Fragments组成,它主要...

85520
来自专栏互扯程序

java中的内存模型

现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文能学到知识,请把知识与别人分享。

18940
来自专栏岑玉海

Carbondata源码系列(二)文件格式详解

在上一章当中,写了文件的生成过程。这一章主要讲解文件格式(V3版本)的具体细节。 1、字典文件格式详解 字典文件的作用是在存储的时候将字符串等类型转换为int类...

51860

扫码关注云+社区

领取腾讯云代金券