tp5学习笔记一一控制器、请求和响应、数据库、模型和关联

五、控制器
1.控制器定义
控制器文件放在application/module/controller下,类名和文件名保持大小写一致,采用驼峰法命名(首字母大写)。

<? php
    namespace app\index\controller;
    use think\Controller;
    class Index extends Controller{
    public function index(){
        return 'index';
    }
}

2.跳转

$this->success();
$this->error();

设置默认的跳转模板:dispatch_error_tmpl、dispatch_success_tmpl
3.重定向

$this->redirect();

4.空操作
在控制器类中定义一个_empty()的 空操作方法,当系统找不到指定的操作方法时,会自动触发空操作的方法。
5.空控制器
给项目定义一个Error控制器类,当系统找不到指定的控制器时,会触发空控制器返回。
或修改empty_controller,更改默认的空控制器名。
六、请求和响应
使用request对象
1.未继承控制器时,需要实例化调用$request=Request::instance();
2.继承系统的控制器基类think\Controller,直接使用$this->request属性调用。
$this->request->url():获取当前URL地址,不含域名;
$this->request->bind(属性,属性值):动态绑定属性。
3.助手函数
request()->url():使用助手函数获取当前URL地址
4.request对象获取请求信息

方法说明
url()获取当前完整URL
baseUrl()获取不含参数信息的URL地址
query()获取当前URL地址的参数信息
domain()获取当前包含协议的域名
method()获取当前请求类型
module()获取当前模块
controller()获取当前控制器
action()获取当前方法

5.request对象获取、检测、过滤输入变量

方法说明
has()检测变量是否设置
param()获取当前请求变量
get()获取$_POST变量
post()获取$_GET变量
session()获取$_SESSION变量
cookie()获取$_COOKIE变量
request()获取$_REQUEST变量
file()获取$_FILES变量

6.response响应对象
(1)作用:输出数据给客户端或者浏览器。
(2)响应输出
输出类型:json、xml、redirect重定向、view模板输出、 t h i s − > s u c c e s s 或 this->success或 this>successthis->error、download文件下载。
(3)修改默认输出类型:在配置文件,设置:‘default_return_type’=> ‘json’。
七、数据库
1.数据库配置
在database.php文件中进行数据库相关的配置。
2.query、execute
query:用在查询相关的SQL语句
execute:用在增、改、删相关的SQL语句
3.增删改查
增:Db::execute(‘insert into 表名 (字段1,字段2,…) values (值1,值2,…)’)
改:Db::execute(‘update 表名 set 字段=值 where 条件’)
查:Db::query(‘select 字段 from 表名 where 条件’)
删:Db::execute(‘delete from 表名 where 条件’)
显示数据库表:Db::execute(‘show table from 数据库名’)
清空数据表:Db::execute(‘TRUNCATE table 表名’)
参数绑定、命名空间占位符绑定
参数绑定:Db::execute(‘insert into 表名 (字段1,字段2,…) values (?,?,…)’,[值1,值2,…]) 用?代替占位符,第二个参数告诉前面的?是什么值
命名空间占位符绑定:Db::execute(‘insert into 表名 (字段1,字段2,…) values (:字段1,字段2,…)’,[字段1=>值1,字段2=>值2,…])
多个数据库切换查询操作
4.connect
(1)配置数据库Db1,数据库Db2(包含:数据库类型、服务器、数据库名、数据库账号密码)
(2)Db::connect(‘数据库Db1’)->query(SQL语句)
Db::connect(‘数据库Db2’)->query(SQL语句)
5.查询构造器

table需要表前缀
name不需要表前缀

增:Db::table(表名)[->strict(false)]->insert([字段1=>值1,字段2=>值2,…])
其中:strict(false):表示不抛出异常;insertAll():添加多条数据,返回添加成功的条数
Db::table(表名)->data(数据集)->insert()
改:Db::table(表名)->where(条件)->update([字段1=>值1,字段2=>值2,…])
查:Db::table(表名)->where(条件)->select()
删:Db::table(表名)->where(条件)->delete()

DB链式操作
Db::name(表名)->where(条件)->field(字段)->order()->limit()->select()

6.事务支持

Db::startTrans();  //启动事务
try{
      //代码逻辑
    Db::commit();  //提交事务
}catch(\Exception $e){
    Db::rollback();   //回滚事物
}

7.查询语言
查询表达式:= >= <= <> < > like between in null >time >=time <time <=time
获取某列某行的某个值:value(字段)
获取某列:column(字段)
聚合查询:count、max、min、avg、sum
日期查询:where(‘字段’,‘查询表达式’,‘时间值’)、whereTime(‘字段’,‘查询表达式’,‘时间值’)
whereBetweenTime(‘字段’,‘时间1’,‘时间2’):时间的区间查询,只有一个时间时,仅查询某一天的值
时间表达式:today、yesterday、week、last week、month、last month、year、last year、d、w、m、y、-2 hours[表示两小时内]
获取某行:find()
助手函数:db(‘表名’,[‘数据库名’]),连接不同数据库时,需要第二个参数。
八、模型和关联
1.模型定义

<? php
 namespace app\index\model;
 use think\Model;
 class Index extends Model{

 }

(1)模型类命名规则:数据表名的驼峰法,不包含表前缀,模型会自动对应数据表。
(2)模型类和数据表不一样时:
设置属性(数据表):protected $name=表名
模型名和PHP关键字冲突时,需要开启类后缀:class_suffix,则定义类时就要加上对应的后缀(包括控制器类,以及对应的文件名都要加后缀)。
(3)模型设置:数据表使用id作为主键。当没有使用id作为主键时,需要在模型中设置属性 protected $pk=‘表的主键’。模型不会自动获取主键名称,必须设置pk的属性。
设置指定数据表:
protected $table='数据表名'(含前缀)
protected $name='数据表名'(不含前缀)
设置指定数据库连接:
protected $connection ='数据库名'
2.增删改查
(1)新增
需要实例化模型对象。
save():插入单条;
saveAll():插入多条;
allowField(true)->save():allowField表示过滤非数据表字段。
(2)查询
get()默认根据主键查询。
[参数:即字段和对应值得键值对,则根据这些条件查询]。
all()查询多个数据。
使用查询构造器查询。
动态查询。
根据某个条件(字段)查询数据:getByXxxx()方法[其中Xxxx可以是数据表任意存在的字段]。
(3)更新
先查询,再赋值,save修改。其中save()的第二个参数为更新的条件。
静态方法更新:update()

自动识别:
实例化模型后调用save方法是新增;
查询数据后调用save方法是更新;
save方法传入第二参数(条件)是更新;
isUpdate(true/false)方法指定当前save方法是新增或更新。

(4)删除
先查询,再delete()删除。

3.自动时间戳
两种开启方式:
(1)全局开启,在配置文件中设置:

auto_timestamp  //开启自动写入时间戳字段

(2)在模型类中单独开启

protected $autoWriteTimestamp = true;

4.自动写入字段
自动写入的字段为:create_time、update_time
(1)写入值默认为int类型,或可自定义写入值。

protected $autoWriteTimestamp = 'datetime';

(2)自定义写入字段

protected $createTime = '自定义字段';
protected $updateTime = '自定义字段';

(3)单独关闭某个字段不自动写入

protected $updateTime = false;

5.只读字段
保护某些字段值在执行更新操作时不被更改。
(1)在模型类中定义readonly属性

protected $readonly = ['字段1', '字段2'];  

(2)或模型方法

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

(3)只读字段仅针对模型的更新方法,对数据库的更新方法无效。
6.类型转换
在写入和读取时,自动进行字段值的类型转换。

protected $type = ['字段','类型'];

支持的类型:integer【整形】、float、boolean、array、object、serialize【序列化】、json、timestamp【时间戳】、datetime【Y-m-d H:i:s】。
其中:timestamp在写入时自动使用strtotime生成对应的时间戳,输出时自动转换为dateFormat属性定义的时间字符串格式,默认的格式为Y-m-d H:i:s。
7.自动完成
在写入数据库时,不需要对写入的字段的值进行手动赋值。包含三个属性:auto、insert、update

8.读取器
作用:对模型实例的原始数据作自动处理。
读取器方法名的命名规范:get + 属性名(数据表字段)的驼峰命名 + Attr,在方法中实现逻辑处理。在模型的数据对像取值操作时会自动触发。
使用场景:时间日期字段的格式化输出;集合或枚举类型的输出;数字状态的输出;组合字段的输出。
程序在读取属性时自动根据规则检测是否有这个属性对应的方法,如果存在就会调用,并把对应的值传入到方法当中。
9.修改器
作用:对模型设置的数据对象值进行处理。
读取器方法名的命名规范:set + 属性名的驼峰命名 + Attr
10.关联
一对一关联:HAS_ONE 以及对应的BELONGS_TO;
一对多关联:HAS_MANY以及相对的BELONGS_TO;
多对多关联:BELONGS_TO_MANY。
(1)一对多
在模型中定义关联方法,调用hasMany()。
hasMany(‘关联模型’,‘关联字段’,‘当前模型关联字段’)。
(2)一对一
hasOne(‘关联模型’,‘关联字段’,‘当前模型关联字段’)。
(3)多对多
模型1定义关联方法:belongsToMoney(‘关联模型’,‘中间表’,‘关联字段1’,‘关联字段2’)。【关联字段为中间表的对应字段】
模型2定义关联方法:belongsToMoney(‘关联模型’,‘中间表’,‘关联字段1’,‘关联字段2’)。【关联字段为中间表的对应字段】
attach()增加中间枢纽,即中间表。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值