五、控制器
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−>success或this->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()增加中间枢纽,即中间表。