TP5整理开发文档
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
<?php
//跨域ajax请求:
//class 前面加:
header("Access-Control-Allow-Origin: *");
开启调试
\application\config.php 22行附近
'app_trace' => false,——》'app_trace' => true,
全局公用函数扩展
application\common.php 文件中定于自己的函数,全局可以调用
common.php里:
function my_fun(){
return '2222222222222222';
}
任意一个控制器直接调用即可:
echo my_fun();
全局公用类库扩展
创建的类库存放于 extend目录下面
示例文件:
extend\org\util\ArrayList.php
extend\org\util\下面如果org和util没有,自行添加文件夹
> 注意
ArrayList类的命名空间是 namespace org\util,而不是 namespace extend\org\util
使用类库扩展:
use org\util\ArrayList;
$aa= new ArrayList();
项目的公共类库
application\common\util\ 下新建没有文件夹自行创建
SESSION 的使用
加载使用SESSION:use think\Session;
//设置当前作用域
Session::prefix('think');
//赋值:(当前作用域)
session('id','1');
session('','1');
//判断是否有值(当前作用域)
session('?id');
session('?');
//取值(当前作用域)
session('id')
session('')
//删除的值(当前作用域)
session('id',null);
session('',null);
//清空session (当前作用域)
session(null);
$_SESSION=array();
$_SESSION=[];
//赋值:(think222作用域)
session('id','1','think222'); session('','1','think222');
//判断是否有值(think222作用域)session('?id','think222');
session('?');
//取值(think222作用域)
session('id','','think222')
session('')
//删除的值(think222作用域)
session('id',null,'think222');
session('',null,'think222');
//清空session (think222作用域)
session(null,'think222');
session 在模板中使用
{:session('user_name')}
{$Think.session.level}
<if $Think.session.level >22232</if>
cookie的使用
加载使用cookie:use think\Cookie;
// 初始化
cookie(['prefix' => 'think_', 'expire' => 3600]);
// 赋值
cookie('name', 'value', 3600);
设置cookie的前缀
Cookie::set('name','yuepeng',['prefix'=>'think_','expire'=>3600])
// 判断
cookie('?name');
判断前缀为think_的name的值
cookie('?name','think_');
// 获取
echo cookie('name');
//获取前缀为think_的name的值
echo cookie('name','think_')
// 删除
cookie('name', null);
//删除前缀为think_的name的值
cookie('name', null,'think_');
// 清除
cookie(null);
cookie(null, 'think_');
1、请求或接受
$data = input('post.'); //批量接受post的值
$data = input('get.'); //批量接受get的值
input('post.sn'); //接受传递来的POST数据中的SN input('get.sn'); //接受传递来的GET数据中的SN input('er_id'); //获取$_SESSION[user_id]值
input('session.'); //获取$_SESSION值
input('er_id') //获取$_SESSION[user][user_id]值
halt() //打印并停止
return json($aaa); 返回json
if (request()->isGet()) echo "当前为 GET 请求";
if (request()->isPost()) echo "当前为 POST 请求";
if (request()->isAjax()) echo "当前为 Ajax 请求";
if (request()->isMobile()) echo "当前为手机访问";
重定向(301) $this->redirect('')
$this->redirect(url('User/login'));
php页面URL生成:url('index/blog/read','id=5');
url('admin/goods/goodsList', 'id=5&name=thinkphp');
html页面URL生成:{:url('index/blog/read','id=5')}
request请求
$request=Request::instance();没有加载父类值使用。
使用助手函数相同效果
返回url
$request->url(); 助手函数 :request()->url();
返回所有的请求参数
$request->param(); 助手函数 :input();
获取get或post参数
$request->get() 助手函数 :input('get.')
$request->get('name') 助手函数 :input('')
$request->post() 助手函数 :input('post.')
$request->post('name') 助手函数 :input('')
2、数据库操作
EQ、= 等于(=)
NEQ、<> 不等于(<>)
GT、> 大于(>)
EGT、>= 大于等于(>=)
LT、< 小于(<)
ELT、<= 小于等于(<=)
LIKE 模糊查询
[NOT] BETWEEN (不在)区间查询
[NOT] IN (不在)IN 查询
[NOT] NULL 查询字段是否(不)是NULL
[NOT] EXISTS EXISTS查询
EXP 表达式查询,支持SQL语法
> time 时间比较
< time 时间比较
between time 时间比较
notbetween time 时间比较
use think\Db; 引用Db
原生态:
$res =Db::execute('insert into ...')
$aa= Db::query("SELECT * FROM `tp_goods` WHERE ( is_hot=1 and is_on_sale=1 ) ORDER BY goods_id DESC LIMIT 1");
dump($aa);
查询构造器
where* 用于AND查询字符串、数组和对象
whereOr* 用于OR查询字符串、数组和对象
wheretime* 用于时间日期的快捷查询字符串
field* 用于定义要查询的字段(支持字段排除)字符串和数组
order* 用于对结果排序字符串和数组limit 用于限制查询结果数量字符串和数字group 用于对查询的group支持字符串
having 用于对查询的having支持字符串
lock 用于数据库的锁机制布尔值
其中带*标识的表示支持多次调用。
$sup_info =M('sup_user')->where($condition)->value('sup_id,sup_name');
输出sql语句
echo M('sup_user')->getLastSql();die();
$sup_info
=M('sup_user')->where($condition)->field('sup_id,sup_name')->find();
二表联查
$negative_stock = GoodsNegativeStock::alias('gn')
->join('goods g', 'gn.goods_id = g.goods_id')
->where('g.goods_id', $goods_id)
->field()
->select();
三表联查
$list = Users::alias('u')
->join('user_level ul', 'u.level=ul.level_id')
->join('users_book ub', 'er_id=er_id')
->where('u.mobile', $search_key)
->field("er_id,u.nickname,u.identity,u.level,u.is_lock,ul.level_name,ub .user_book,ub.surplus_book")
->find();
跨数据库查询
$res=Db::table('test.tp_userss')->alias('a')->join('tp.tp_users b ','a.id=er_id')->where('a.id','1')->field('a.id,er,a.time,er_id')-> select();
对象转数组
$p=对象
print_r(collection($p)->toarray());
[limit($Page->firstRow.','.$Page->listRows)->] [select()]
name('')不带前缀的表名,前缀自动配置文件获取
//写入:
Db::name('goods')->insert('数组');
//修改
Db::name('goods')->where('id',2)->update(['name'=>"hello"])
Db::name('goods')->where('rid',$rid)->update(['region'=>$data['region']]);
// score 字段加 1
Db::name('think_user')->where('id', 1)->setInc('score');
// score 字段加 5
Db::name('think_user')->where('id', 1)->setInc('score', 5);
// score 字段减 1
Db::name('think_user')->where('id', 1)->setDec('score');
// score 字段减 5
Db::name('think_user')->where('id', 1)->setDec('score', 5);
自增、自减或者修改多个字段
inc()//自增的数据
dec()//自减的数据
data() //修改的数据
update();//执行
M('coupon')->where('id',$cid)->inc('send_num',$able)->data('is_send','1')-> update();
//删除
Db::name('goods')->where('id',4)->dalete()
//模糊查询
Db::name('goods')->where('id','=',3)->where('name','like','%php%')->select( )
Db::name('goods')->where('id','>=',3)->select()
Db::name('goods')->where('id','<>',3)->select()
//全查询
Db::name('goods')->where('id',3)->select()
//值查询查询id为1的name 值
Db::name('goods')->where('id',1)->value('name')
//行查询查询id为1的id和name 值
Db::name('goods')->where('id',1)->field('id,name')->order('id','desc')->lim it(10)->find();
//包含查询
Db::name('goods')->where('id','in',[1,2,3,4,5,6])->select()
//区间查询
Db::name('goods')->where('id','between',[1,6])->select()
//查询是否为空
Db::name('goods')->where('id','null')->select()
//列查询
1、获取id键名,name为值的键值对 where start=1
Db::name('goods')->where('start',1)->column('id','name')
2、获取以id为键名的数据集 where start=1
Db::name('goods')->where('start',1)->column('*','id')
//统计查询
行数 Db::name('goods')->where('start',1)->count()
最大max Db::name('goods')->where('start',1)->max('id')
最小min Db::name('goods')->where('start',1)->min('id')
平均avg Db::name('goods')->where('start',1)->avg('id')
总数sum Db::name('goods')->where('start',1)->sum('id')
建议使用占位符方式查询后面数查询数组
Db::name('goods')->where("id>:id and name like :name",['id'=>10,'name'=>"%php%"])->select();
时间、日期查询 (不用日期转时间戳,直接写日期、时间)
Db::name('users')->whereTime('reg_time','>','2016-01-01')->select();
//获取今天(today)
//昨天(yestoday)
//本周(week)
//上周 (last week)
直接使用 Db::name('users')->whereTime('reg_time','>','week')->select();
//查询最近2天直接使用’-2 days‘
Db::name('users')->whereTime('reg_time','>','-2 days')->select();
//查询区间日期
Db::name('users')->whereTime('reg_time','between',['2016-01-01','2016-01-31 '])->select();
链式查询
$goods=Db::name('goods')->where(goods_id,$order['goods_id'])->field('goods_ name,original_img')->order('id','desc')->limit(10)->find();
$goods=db('goods')->where(goods_id,$order['goods_id'])->field('goods_name,o riginal_img')->find(); //助手函数查询数据库,取多个字段
事物
自动事物
Db::transaction(function(){
Db::name('goods')->delete(1);
Db::name('goods')->insert([id]=>2,'name'=>'kk');
});
手动事物
Db::startTrans();
try{
Db::name('sup_rk_log')->insertAll($list);
Db::name('sup_goods')->insertAll($goods_info);
Db::name('sup_rk_list')->where("$id_name = '$id_value'")->delete();
Db::commit();
// echo '11111111';
} catch (\Exception $e) {
Db::rollback();
// echo '22222222222';
}
分块查询/分页查询
$p=0;
do{
$res=Db::name('goods')->limit($p,2)->select();
$p +=2;
}
while(count($res)>0);
3、模型与关联
Users::‘model里面的模型类’
插入数据
$aa=new Users;
$aa->name='yuepeng';
$aa->age='555';
$aa->save();
saveall 批量插入
$aa=new Users;
$a=[
['name'=>'1211','age'=>'222'],
['name'=>'1324354','age'=>'43511'],
];
$aa->saveall();
get主键查询
$id=1;
$a= Users::get($id);
print_r($a->name); 或者 print_r($a['name']);
getby任何字段查询
$a =Users::getbyname('张三');
get不是主键查询
get 和where 都是一样的
$a=Users::get(['name'=>'张三'],'age'=>'20');
$a=Users::where(['name'=>'张三'])->find();
$a=Users::where(['name'=>'张三'],'age'=>'20')->find();
$a=Users::all(); 查询users表里所有数据
$a=Users::all(['id'=>2]); 查询users表里id为2的数据
$a=Users::where('id','<=',2)->select(); 查询users表里id小于等于2的数据
查询后重新赋值即修改
$a=Users::get(1);
$a->name='岳鹏';
$a->age= '30';
print_r($a->save());
查询后,引用查询的数据,新增
$a=Users::get(1);
$a->id=null; // 清除主键
print_r($a->isUpdate(false)->save());
直接更新
$aa[name]='hahaa';
$aa[age]='5550';
print_r(Users::update($aa,['id']=>1));
删除数据
$id=1;
$a=Users::get($id);
$a->delete();
或者
Users::destroy($id);
读取器方法的命名规范:get+字段名的驼峰命名+Attr
$a=Users::get($id);
echo $a->add_time;
Users model里面要是有getAddTimeAttr(get+字段名的驼峰命名+Attr)这个方法,则调用这个方法(如:格式化日期或转换类型),反之条用tp自带方法(字段值原样返回)
修改、写入器方法的命名规范:set+字段名的驼峰命名+Attr
$a=Users::get($id);
echo $a->add_time;
Users model里面要是有setAddTimeAttr(get+字段名的驼峰命名+Attr)这个方法,则调用这个方法(如:格式化日期或转换类型),反之条用tp自带方法(字段值原样返回)
自动类型转换:
相关model里面添加如下:'add_time' 为自动转换的字段名 =>转化的格式
protected $type =array(
'add_time'=>'timestamp:Y-m-d',
'name'=>'integer',
)
自动完成:insert update auto(写入和修改都有效)
protected $auto =array(
'add_time'=>'111',
);
查询范围命名规范:scope+字段名
protected function scopeAge($query){
$query->where('age','20');
}
protected function scopeAddTime($query){
$query->where('add_time','>','1512375845');
}
控制器调用:$list = User::scope('email,status')->all();
全局查询范围:调用查询范围是自动调用全局查询范围
protected function base($user_id){
$query->where('user_id',1);
}
4、关联
1:一对多关联:
Users Model类里:
public function comm(){
return $this->hasMany('UserAddress','uid','id');
}
创建UserAddress model
comm 是属性也是方法,如果不加()就是属性,调用出来的是数据集合,加()就是方法,调用出来是Object对象,可以添加where 去查询
1)调用属性:$user->comm;
foreach ($user->comm as $key => $value) {
echo '我是:'.$user->name.'地址是:'.$value->address;
}
2)调用方法:
$aaa=$user->comm()->where('address','西安市')->select();
foreach ($aaa as $key => $value) {
print_r($value->address);
}
$aaa=$user->comm()->where('address','西安市')->find();
echo $aaa->address;
2:一对一关联:
public function car()
{
// 用户HAS ONE档案关联
return $this->hasOne('Car','uid','user_id');
}
3:多对多关联:
5、模型输出
toarray 对象转数组
tojson 对象转json
$user=Users::get(2);
echo $user; 直接输出默认json格式
dump($user->toarray()); 全部显示
dump($user->hidden(['id','name'])toarray()); 隐藏字段
dump($user->visible(['id','name'])toarray()); 只显示字段
dump($user->append(['time111=>trtr'])->toarray);
6、视图和模板
url生成:
<a href="{:url('index/info', ['id' => $v['id']])}">
<a href="{:url('index/info'}">
{$Think.server.script_name} // 输出$_SERVER['SCRIPT_NAME']变量{$er_id} // 输出$_SESSION['user_id']变量
{$Think.get.page} // 输出$_GET['page']变量
{$} // 输出$_COOKIE['name']变量
时间戳直接转化:
{$vo.start_time|date='Y-m-d H:i:s',###}
使用默认位置模板:
return $this->fetch();
调用当前控制器下面的edit模板:
return $this->fetch('edit');
调用Member控制器下面的read模板:
return $this->fetch('member/read');
跨模块渲染模板:
return $this->fetch('admin@member/edit');
一、模板默认值
//我们可以给变量输出提供默认值,例如:
{$user.nickname|default="这家伙很懒,什么也没留下"}
//对系统变量依然可以支持默认值输出,例如:
{$|default="名称为空"}
//默认值和函数可以同时使用,例如:
{$|getName|default="名称为空"}
二、判断:
if标签
<if condition='$list.type eq 2'>
<else />
</if>
<if ( $v.is_exa eq 0) && ( $v.is_end eq 0) > <if ( $v.is_exa eq 0) or ( $v.is_end eq 0) > <if $v.is_exa eq 0 >
三、运算
运算符使用示例
+ {$a+$b}
- {$a-$b}
* {$a*$b}
/ {$a/$b}
% {$a%$b}
++ {$a++} 或 {++$a}
-- {$a--} 或 {--$a}
综合运算{$a+$b*10+$c}
在使用运算符的时候,不再支持常规函数用法,例如:{$user.score+10} //正确的
{$user['score']+10} //正确的
{$user['score']*$user['level']} //正确的
{$user['score']|myFun*10} //错误的
{$user['score']+myFun($user['level'])} //正确的
三元运算
{$status? '正常' : '错误'}
{$info['status']? $info['msg'] : $info['error']}
{$info.status? $info.msg : $info.error }
{$varname.aa ?? 'xxx'}
四、循环:
循环一:FOREACH标签
{foreach $list as $vo}
{$vo.id}:{$}
{/foreach}
可以输出索引,如下:
{foreach name="list" item="vo" }
{$key}|{$vo}
{/foreach}
也可以定义索引的变量名
{foreach name="list" item="vo" key="k" }
{$k}|{$vo}
{/foreach}
循环二:volist标签
{volist name="list" id="user"}
id:{$user.id}<br/>
名称:{$}<br/>
年龄:{$user.age}<br/><br/>
{/volist}
支持输出查询结果中的部分数据,例如输出其中的第5-15条记录
{volist name="list" id="vo" offset="5" length='10'}
{$}
{/volist}
输出偶数记录
{volist name="list" id="vo" mod="2" }
{eq name="mod" value="1"}{$}{/eq}
{/volist}
为空的时候输出提示:
{volist name="list" id="vo" empty="暂时没有数据" }
{$vo.id}|{$}
{/volist}
empty属性不支持直接传入html语法,但可以支持变量输出,例如:
$this->assign('empty','<span class="empty">没有数据</span>');
$this->assign('list',$list);
然后在模板中使用:
{volist name="list" id="vo" empty="$empty" }
{$vo.id}|{$}
{/volist}
循环三:FOR标签
{for start="开始值" end="结束值" comparison="" step="步进值" name="循环变量名"}
{/for}
开始值、结束值、步进值和循环变量都可以支持变量,开始值和结束值是必须,其他是可选。
comparison 的默认值是lt,name的默认值是i,步进值的默认值是1,举例如下:{for start="1" end="100"}
{$i}
{/for}
五、比较:
比较标签
标签含义
eq 等于
neq 不等于
gt 大于
egt 大于等于
lt 小于
elt 小于等于
heq 恒等于
nheq 不恒等于
{eq name="name" value="value"}
相等
{else/}
不相等
{/eq}
六、分页:
控制器:
$list =Users::paginate(1);
$this->assign('list',$list);
$this->assign('count',count($list));
模板:
总数:{$count}
{volist name="list" id="user"}
id:{$user.id}<br/>
名称:{$}<br/>
年龄:{$user.age}<br/><br/>
{/volist}
{$list->render()}
七、公共模板
模板:引入公共模板:{include file ="index/header" title="页面头部标题" keywords="页面关键字"}
公共模本:
api开发
$user=Users::get(1);
if($user){
return json(array(
'status' => 1,
'mag' => '查询成功',
'data' => $user,
))
}else{
return json(array(
'status' => -1,
'mag' => '查询失败',
'data' => '',
))
}。