技术学习

THINKPHP 2

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调试

THINKPHP 2

// 应用Trace
'app_trace'              => true,

小结

where方法 连贯操作方法

连表查询

THINKPHP 2

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();
GouGe
程志辉 前行的路充满未知,不努力尝试,永远都不知道有多精彩。

发表评论