**Thinkphp5.1**是国内顶级的php框架之一,初学入坑必备
## 通过composer安装TP5框架
~~~
composer create-project topthink/think tp5
~~~
## URL解析
serverName/index.php/模块/控制器/操作/参数
模块在application文件夹下面 默认有index文件夹(模块为index)
index模块下面有:
控制器 controller 文件夹 默认是 Index.php (首字母必须大写)
控制器里面有操作的方法 index()
```
public function index($id){
return $id;
}
```
方法里面带参数 $id
参数可以带默认值
```
public function hello($name='laowang'){
return "hello" . $name;
}
```
访问URL必须带上参数名:name/xiaobai就能打印,如果没有默认则访问
hello xiaobai
## 模块设计
多模块设计:
所有模块命名空间以app作为根命名空间
```
application
module1
common.php 模块函数文件
config 配置目录(可选)
controller 控制器(必须)
model 模型(可选)
view 视图(可选)
```
如果只有一个模块时候,可以绑定这个模块:
public/index.php追加方法:
绑定模块、控制器 test/index
``Container::get('app')->bind('test')->run->send();
``
其他模块就无法访问
config目录下的app.php
可以设置空模块
'empty_module' => 'index'
*****
单模块设计:
config目录下的app.php设置
'app_multi_module' => false; //支持多模块改为false
控制器+操作
在application下面可以不存在模块文件夹,直接写控制器 controller
环境变量Env
获取环境变量:应用目录
return Env::get('app_path');
*****
## 控制器说明:
### 1,控制器定义
类名和文件名大小写保持一致,才用驼峰式命名,首字母大写
继承Controller基类,可以调用父类的方法,但不是必须的
假如命名有两个字母组成,例如HelloWorld,访问时候用_关联访问:hello_world
config目录下的app.php配置文件可以关闭URL自动转换:
'url_convert'=>false;
*****
改变根命名空间方法:由app改成其他名称
Env全局配置
根目录添加.env文件
app_namespace=application
*****
### 2,控制器渲染输出
1,return ,相当于echo ,输出的是字符串
2, 使用json输出 ,json()函数
```
$data= array('a'=>1,'b'=>2,'c'=>3);
return json($data);
```
3,view 输出模板
```
public function abc(){
return view();
}
```
要求在模块里面创建view文件夹,
里面对应建立相关控制器文件夹 (例如test),
里面建立相关方法名称(abc)的html文件 abc.html
config目录下的app.php配置文件可以控制默认输出类型:
'default_return_type' => 'html'; 默认是html(文本)
'default_ajax_return_type' => 'json';
一般来说,正常页面都是html输出,用于模板。AJAX默认为JSON
如果继承了基类控制器,可以定义控制器初始化方法:initialize();
//初始化,必须执行的方法
protected function initialize(){
//只支持输出(echo),不支持返回(return)
echo "init";
}
*****
## 控制器操作
前置操作:
继承Controller类后可以设置一个$beforeActionList 属性来创建前置方法:
//里面是写方法名 except是指定不调用哪个方法; only 是指定调用哪几个方法
```
protected $beforeActionList= [
'first',
'second'=>['except'=>'one'],
'third'=>['only'=>'one,two'],
];
protected function first(){
echo "first<br/>";
}
```
*****
跳转和重定向
```
protected $flag =false;
public function index(){
if($this->flag){
//如果不指定URL ,则返回 $_SERVER['HTTP_REFEER']
this->success('注册成功','../');
}else{
this->error("失败");
}
}
```
跳转默认模板文件
thinkphp/tpl/dispatch_jump.tpl
'dispatch_success_tmpl' => Env::get('think_path');
*****
空方法与空控制器(访问不存在时不报错)
默认空方法
```
public function _empty($name){
return "此方法不存在" .$name;
}
```
默认空控制器
在controoler 里创建Error.php
```
class Error{
public function index(Request $request){
return "此控制器不存在".$request->controller();
}
}
```
app.php配置文件修改默认空控制器
'empty_controller' => 'Error'
*****
##
## 数据库操作
配置文件在config/database.php
```
use think/Db;
public function getNoModelData(){
//table需要加前缀 ; name不需要加前缀
//$data = Db::table('完整表名')->select();
$data = Db::name('表名')->select();
return json($data);
}
```
*****
定义Mopdel:
在模型里面新建 model 文件夹;并且创建与数据表名一致的php文件:User.php
```
namespace app\model;
use think\Model;
class user extends Model{
}
```
*****
在控制器里面使用
```
use app\index\model\User;
public function getModelData(){
$data= User::select();
return json($data);
}
```
*****
建议调试时候打开Trace
配置文件app.php
'app_trace' = true;
右下角调试图标里面的SQL可以看到完整的sql语句
*****
### 查询方法:
1. 查询一条数据: Db::name('表名')->find() 【LIMIT 1】
2. 查看最后执行sql: Db::getLastSql();
3. 查询条件: Db::name('表名')->where('id',10)->find();
5. 没有查询到值会返回null
6. 没有查询到数据时返回异常: Db::name('表名')->where('id',10)->findOrFail();
7. 没有查询到数据时返回空数组:
8. Db::name('表名')->where('id',10)->findOrEmpty();
10. 查询多条数据: Db::name('表名')->select()
11. 没有查询到数据时返回异常:
12. Db::name('表名')->where('id',10)->selectOrFail();
14. 查询指定字段单个值:Db::name('表名')->where('id',10)->value('username');
16. 查询指定列多个:Db::name('表名')->column('username');
17. 指定id作为索引:Db::name('表名')->column('username','id');
-----------------------------------------------------
### 新增insert()
```
$data=[
"name"=>"wang",
"age"=>"32"
];
$flag = Db::name('表名')->insert($data);
if($flag) return "success";
//获取新增的id
return Db::insertGetId();
```
### 批量新增 insertAll()
###
```
$dataall=[
[
"name"=>"wang",
"age"=>"32"
],
[
"name"=>"li",
"age"=>"27"
]
];
Db::name('表名')->insertAll($data);
```
*****
### 修改 update()
###
//批量修改
```
$data=[
"name"=>"laowang"
];
$update= Db::name('表名')->where('id',10)->update($data);
return $update;
```
增值 inc() 参数1:字段名;参数2,数量
Db::name('表名')->inc('字段名',1)->where('id',10)->update($data);
减值 dec()参数1:字段名;参数2,数量
Db::name('表名')->dec('字段名',1)->where('id',10)->update($data);
字段使用mysql函数 exp() 参数1:字段名;参数2,方法
Db::name('表名')->exp('email','UPPER(email)')->where('id',10)->update($data);
### raw() 方法修改更新:
```
$data = [
'name' => 'wang',
'email' => Db::raw('UPPER(email)'),
'price' => Db::raw('price - 3'),
'id' => 10
];
Db::name('表名')->update($data);
```
//修改单个字段 setField()
$update= Db::name('表名')->where('id',10)->setField('name','老王');
*****
### 删除 delete()
//删除单条
Db::name('表名')->delete(10);
//删除多条
Db::name('表名')->delete([1,2,3,4]);
//根据条件删除
Db::name('表名')->where('id',10)->delete();
//全部删除
Db::name('表名')->delete(true);
*****
### 比较查询
= 、<> 、 > 、 <
等于、不等于、大于、小于
Db::name('表名')->where('id','<>',10)->select();
###
### 区间查询
like
Db::name('表名')->where('name','like','wang%')->select();
支持数组传递多个值:
Db::name('表名')->where('name','like',['wang%','li%'],'or')->select();
select * from 表名 where('name' like 'wang% or 'name' like 'li%')
*****
whereLike()
Db::name('表名')->whereLike('name','wang%')->select();
whereNoLike()
Db::name('表名')->whereNoLike('name','wang%')->select();
*****
between 区间段从多少到多少
Db::name('表名')->whereLike('id','between','19,25')->select();
Db::name('表名')->whereLike('id','between',[19,25])->select();
Db::name('表名')->wherebetween('id',[19,25])->select();
//区间段不在从多少到多少
Db::name('表名')->whereNotbetween('id',[19,25])->select();
*****
in 包含多少
Db::name('表名')->where('id','in','19,20,25'])->select();
Db::name('表名')->whereIn('id','19,20,25'])->select();
//不包含多少
Db::name('表名')->whereNotIn('id','in','19,20,25'])->select();
*****
null 查询为null的数据 参数:字段名
Db::name('表名')->where('uid','null')->select();
Db::name('表名')->whereNull('uid')->select();
notnull 查询不为null的数据 参数:字段名
Db::name('表名')->where('uid','not null')->select();
Db::name('表名')->whereNotNull('uid')->select();
*****
自定义字段后的SQL exp
Db::name('表名')->where('id','exp','In(1,2,3)')->select();
Db::name('表名')->whereExp('id','In(1,2,3)')->select();
*****
### 时间查询
操作: >、<、 >=、 <=
Db::name('表名')->where('create_time','> time','2019-01-01')->select();
Db::name('表名')->whereTime('create_time','>','2019-01-01')->select();
*****
###
### 区间查询
Db::name('表名')->where('create_time','between time',['2019-01-01','2019-10-30'])->select();
Db::name('表名')->whereBetween('create_time',['2019-01-01','2019-10-30'])->select();
//查询可以当天 whereBetweenTime: 当天查询:一个参数; 区间查询: 两个参数
Db::name('表名')->whereBetweenTime('create_time','2019-01-01','2019-10-30')->select();