day2上午
配置文件database.php
数据库使用前缀
// 数据库表前缀
'prefix' => 'tpshop_',
使用前缀原因
早期互联网服务器费用非常昂贵,多数租用的主机数据库等服务(虚拟空间),商家给的数据库只有一个。一个数据库里放多个项目,所以就通过后缀来区分项目。(现在不存在这个问题,价格便宜了
自动写入时间戳字段
// 自动写入时间戳字段
'auto_timestamp' => true,
字段中也需要有 create_time update_time
自动写入创建时间 | 自动写入更新时间 | |
---|---|---|
insert() | 不支持 | 不支持 |
save() | 支持 | 支持 |
update() | 不支持 | 支持 |
数据及返回类型
// 数据集返回类型
'resultset_type' => 'array', //数组
// 数据集返回类型
'resultset_type' => 'collection', //集合
手动实例化模型
$model = new \app\admin\model\Goods();
use app\admin\model\Goods;
$model = new Goods();
//控制器 如果 与模型重名 会引发冲突
use app\admin\model\Goods as GoodsModel;
$model = new GoodsModel();
查询多条数据
//取到的对象 外层数组里层对象 里层的对象 可以当数组使用
// all 和 select都可以用
$data = \app\admin\model\Goods::select();
$data = \app\admin\model\Goods::select('32,33,34');
$data = \app\admin\model\Goods::select([32,33,34]);
$data = $model->all();
//只能用all 不能用select
$data = \app\admin\model\Goods::all(['status'=>1]);
将返回结果 转化为标准二维数组
默认情况下 返回的结果 外层是数组 里层是对象
foreach ($data as $v){
//输出商品名称 goods_name
//dump($v->goods_name);
dump($v['goods_name']);
}
foreach ($data as &$v){
//对象转化成数组
$v = $v->toArray();
}
unset($v); //$v没用了就销毁
//集合对象 $data是一个数组 数组无法直接用toArray 需要给他转化为一个对象
$data = (new Collection($data)) -> toArray();
dump($data);die;
后缀html
// URL伪静态后缀
'url_html_suffix' => 'html',
页面渲染
//查询列表数据
$list = \app\admin\model\Goods::select();
//$this->assign('list',$list);
//return view();
return view('good_list',['list'=>$list]);
//变量输出 数组遍历
{foreach name="list" key="k" item="v"}
{foreach $list as $v}
{$v['id']}
{$v.goods_name}
{$v->goods_price}
{$v:goods_number}
//文件地址
/index.php/admin/goods/create.html
//:冒号的意思 与$变量区分开
// 在同一模块 统一控制器 可以省略前面两个 admin/goods
{:url('admin/goods/create')}
{:url('goods/create')}
{:url('create')}
//URL 传参
index.php/admin/goods/edit/id/32.html
{:url('admin/goods/edit',['id'=>$v.id])}
注意点: 模板语言{$name} 不要用html注释<!-- 我是注释 --> 推荐直接删掉
volist标签
{volist name="数组变量名" key="k" id="v" offset="5" length="10" empty="nothing"}
{/volist}
id:当前的循环变量,是一个变量名(foreach使用的是item)
offset:指定从第几个开始遍历,从0开始计数
key:定义循环变量名,默认为i,当前遍历的是第几个,从1开始计数,与原数组下标无关
empty:没有数据时显示的内容
其中,如果没有定义key属性,可以直接输出{4key}变量表示原数组的下标
URL生成
THINKPHP5.0支持路由URL地址的统一生成,并且支持所有的路由方式,以及完美解决了路由地址的反转解析,无需再为路由定义的变化而变化URL生成。URL生成使用thinkUrl::build()方法或者使用系统提供的助手函数url(),参数一致。
Url::build("地址表达式",['参数'],['URL后缀'],['域名'])
url("地址表达式",['参数'],['URL后缀'],['域名'])
默认情况下 URL后缀为true 即有.html
dump(url('admin/test/index'));
dump(url('admin/test/read',['id'=>10,'page'=>20]));
dump(url('admin/test/read',['id'=>10,'page'=>20],false));
dump(url('admin/test/read',['id'=>10,'page'=>20],true,true));
dump(url('admin/test/read',['id'=>10,'page'=>20],true,"www.qqzmly.com"));
/*
string(32) "/index.php/admin/test/index.html"
string(45) "/index.php/admin/test/read/id/10/page/20.html"
string(40) "/index.php/admin/test/read/id/10/page/20"
string(66) "http://www.tpshop.com/index.php/admin/test/read/id/10/page/20.html"
string(66) "http://www.qqzmly.com/index.php/admin/test/read/id/10/page/20.html"
*/
查询一条数据
静态调用get find方法
//取出主键为1的数据 where id =1
$user = \app\admin\model\User::get(1)
$user = \app\admin\model\User::find(1)
//使用数组查询(非主键字段),只能用get不能用find where name = 'thinkphp'
$user = User::get(['name'=>'thinkphp']);
//取出第一条数据,只能用find不能用get get方法必须传参数
$user = User::find();
动态调用get find方法
$user = new User();
//取出主键为1的数据
$info = $user->find(1);
$info = $user->get(1);
注意点:get或者find方法返回的是当前模型的对象实例或者null
返回的模型对象,可以直接当做数组使用,也可以调用toArray(),直接转化为数组。
where方法使用
//where方法的使用
$goods = \app\admin\model\Goods::where('id','=','33')->find();
// where 与 find区别 find只能查询主键 而where可以查询其他字段
$goods = \app\admin\model\Goods::find(33);
注意点: 查询方法有find get select all
在使用where后,紧接着只能用find 和 select方法 因为 get 和 all是模型对象方法,where方法返回的Query对象中没有get 和 all方法
批量条件查询
$goods = $mode->where(
[
'goods_price'=>['>','100'],
'id'=>['=','32']
])->select();
$model ->having('id>3')->select();
having与where区别 where是sql条件语句,having是返回结果集后再进行处理数据
连表查询语法
//连表查询语法
//SELECT t1.*,t2.username FROM `tpshop_address` as t1 LEFT JOIN `tpshop_user` as t2 on t1.user_id = t2.id where t1.id<10;
$data = \app\admin\model\Address::alias('t1')
->join('tpshop_user t2','t1.user_id = t2.id','left')
->where('t1.id','<','10')
->field('t1.*,t2.username')
->select();
注意点select all find get一定要放在最后
字段查询
string(14) "Apple iPhone X"
array(5) {
[0] => string(14) "Apple iphone 5"
[1] => string(14) "Apple iphone 6"
[2] => string(14) "Apple iphone 8"
[3] => string(19) "Apple iphone 6 Plus"
[4] => string(14) "Apple iphone 3"
}
//字段值查询
$goods_name = \app\admin\model\Goods::where('id','=','33')->value('goods_name');
dump($goods_name);
$goods_names = \app\admin\model\Goods::where('id','>','35')->column('goods_name');
dump($goods_names);
array(5) {
[36] => string(14) "Apple iphone 5"
[37] => string(14) "Apple iphone 6"
[38] => string(14) "Apple iphone 8"
[39] => string(19) "Apple iphone 6 Plus"
[40] => string(14) "Apple iphone 3"
}
$goods_names2 = \app\admin\model\Goods::where('id','>','35')->column('goods_name','id');
注意点: field 与 value和column区别,打印sql语句是一样的,只是返回对象value和column是一个数组,field是一个对象,需要自己转换为数组。
trace调试
// 应用Trace
'app_trace' => true,
小结
where方法 连贯操作方法
连表查询
day2下午
条件判断标签if
{if condition="($name==1) OR ($name>100)"}value
{elseif condition="$name eq 2" /}value
{else /}value3
{/if}
//也可以写为以下形式
{if ($name==1)}value1
{/if}
范围判断标签in
范围判断标签包括 in notin between ontbetween四个标签,都用于判断变量中是否在某个范围
{in name="id" value="1,2,3"} id在范围内
{/in}
{in name="id" value="$range"} id在范围内
{/in}
Name属性值为变量名,不带$符号
Value属性值可以使字符串范围,也可以是数组变量或者字符串变量,相当于原生php中的if(in_array())
使用函数
两种语法
{$变量名称|函数名称=arg1,arg2,###}
参数中,可以使用###代替输出的变量本身,如果变量本身是第一个参数,可以省略
//对时间格式化
{$v.goods_create_time|date='Y-m-d H:i:s',###}
//对字符串进行md5加密
{$name|md5}
{:函数名(参数)}
{:date("Y-m-d H:i:s",$v['goods_create_time'])}
系统变量
TP框架自带了一个$Think变量,用于在模板中输出系统变量
$Think.server :相当于$_SERVER
$Think.get :相当于$_GET
$Think.post :相当于$_POST
$Think = [
'get' =>$_GET,
'post'=>$_POST
];
$this->assign('Think',$Think);
示例:url地址 http://www.tpshop.com/index.php/admin/goods/index?page=1
展示page参数值 $Think.get.page
使用运算符
+ {$a+$b}
- {$a-$b}
* {$a*$b}
/ {$a/$b}
添加数据
//save方法
$goods_model = new \app\admin\model\Goods();
$goods_model ->goods_name='huawei';
$goods_model ->goods_price='2999';
$goods_model->save();
dump($goods_model->id);
//create方法
$data = ['goods_name'=>'xiaomi','goods_price'=>'1799'];
$goods = \app\admin\model\Goods::create($data);
dump($goods->id);
//批量添加
$goods_model = new \app\admin\model\Goods();
$data = [
['goods_name'=>'xiaomi','goods_price'=>'1799'],
['goods_name'=>'xiaomi','goods_price'=>'1799']
];
$res=$goods_model ->saveAll($data);
dump($res);
create 与 saveAll更加方便 直接传一个数组 save需要一个个去定义
知识点
时间戳
//数据库配置文件中添加全局设置
'auto_timestamp' => true,
//在单独的模型类中设置
protected $autoWriteTimestamp = true;
//时间戳默认为整型int类型,如果时间字段不是int 可以自定义
'auto_timestamp' => 'datetime'
protected $autoWriteTimestamp = 'datetime';
页面跳转与重定向
//成功时跳转
$this->success("提示信息","跳转地址","返回数据","等待时间","header信息");
//失败时跳转
$this->error("提示信息","跳转地址","返回数据","等待时间","header信息");
$this->success('操作成功','index');
返回数据指的是给提示页面返回数据
等待时间默认3s,跳转地址可以不写,默认跳转回上一页
重定向跳转,用于直接跳转,不显示提示信息
$this->redirect("跳转地址","请求参数","http code");
页面提示信息 是继承Controller控制器中的Jump
表单验证
//1.独立验证 定义一个验证规则
$rule = [
'goods_name|商品名称' => 'require',
'goods_price|商品价格' => 'require|float|egt:0',
'goods_number|商品数量' =>'require|integer|egt:0'
];
//错误提示信息 可选
$msg =[
'goods_price.float' => '商品价格必须是整数或者小数'
];
//实例化验证类 validate
$validate = new \think\Validate($rule,$msg);
if(!$validate->check($params)){
//验证失败
$error_msg = $validate->getError();
$this->error($error_msg);
}
//控制器验证
$rule = [
'goods_name|商品名称' => 'require',
'goods_price|商品价格' => 'require|float|egt:0',
'goods_number|商品数量' =>'require|integer|egt:0'
];
$msg =[
'goods_price.float' => '商品价格必须是整数或者小数'
];
//调用控制器的validate方法
$validate = $this->validate($params,$rule,$msg);
if(true!==$validate){
$this->error($validate);
}
过滤非数据表字段
例如 goods_name 数据表字段中没有 这个模型方法就会忽略掉这个字段不去处理他
//第二个值为true 过滤非数据表字段
\app\admin\model\Goods::create(['goods_name'=>'tp','goods_price'=>100],true);
//新增数据
$model -> goods_name ='tp';
$model -> goods_price = 200;
$goods = $model->allowField(true)->save();