前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【实战】Tp5+小程序(一)--数据库访问与ORM

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

作者头像
程序小工
发布2018-09-12 15:29:36
1.4K0
发布2018-09-12 15:29:36
举报
文章被收录于专栏:程序小工

摘要

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

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

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

代码语言:javascript
复制
`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 数据库中间层架构解析

tp5数据库架构
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.三种实现方式:

  • 表达式
  • 数组法(不够灵活,且存在一定的安全问题)
  • 闭包(最灵活)
代码语言:javascript
复制
// 通过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

代码语言:javascript
复制
'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)。

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

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

代码语言:javascript
复制
// config.php
'default_return_type' => 'html'

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 7.2 从一个错误了解 Exception 的继承关系
  • 7.3 TP5 数据库中间层架构解析
  • 7.4 查询构造器一
  • 7.5 查询构造器二
  • 7.6 查询构造器三
  • 7.7 开启 SQL 日志记录
  • 7-8 ORM 与模型
  • 7-9 初识模型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档