分类目录归档:Thinkphp5

Thinkphp5模型时间戳和软删除

use traits\model\SoftDelete;

    //开启自动写入创建时间与更新时间
    protected $autoWriteTimestamp = true;
    //定义时间戳字段名 int default 0
    protected $createTime = 'created_at';
    protected $updateTime = 'update_at';
    use SoftDelete;
    protected $deleteTime = 'delete_time';//默认值为NULL的字段


User::destroy(1);//删除第一条数据
dump(User::get(1));//NULL
User::withTrashed(true)->get(1);//此时可以获取数据
User::onlyTrashed()->select();//获取垃圾箱中的所有数据
User::destroy(1,true);//真实删除
$userModel = User::get(1);
$userModel->delete(true);//同上
1+

Thinkphp5模型修改器

通过模型修改器自动修改对应字段,可以配合自动完成特性,自动修改数据库字段,特别适合更新时间戳

protected $auto=['time'];//新增及修改时更新
protected $insert=['created_at'];//新增时更新
protected $update=['updated_at'];//修改时更新
//model
public function setPasswordAttr($val){
    return md5($val);
}

public function setTimeAttr(){
    return time();
}

public function setTimeAttr(){
    return time();
}

public function setTimeAttr(){
    return time();
}
1+

Thinkphp5模型获取器

在Model中添加如下类型的代码,在获取到模型相关字段时,将会被改变:

public function getNameAttr($val){
    return $val."abc";
}

在controller中使用

$userModel = User::get(1);
$res = $userModel->name;
$data = $userModel->toArray();
$orgdata = $userModel->getData();//获取原始数据
1+

Thinkphp5模型

  • 实例化模型

    $data = User::get(1)->toArray();


    $model = model(“User”);


    $model = new User; $data = $model::get(1)->toArray();


    $model = \Think\Loader::model(“User”);

  • 闭包函数

    $data = User::get(function($query){ $query -> where(“id”,10); })->toArray();

  • 单条记录

    $data = User::where(“id”,10)->field(“username,password”)->find();

  • 多条记录

    //$models = User::all(“1,2,3”); $models = User::all(function($query){ $query->where(‘id’,’in’,[1,2,3])->field(“username,password”); });


    $models = User::where(‘id’,’>’,5)->field(“username,email”)->select();


    foreach($models as $model){ dump($model->toArray()); }

  • 单个字段

    $username = User::where(‘id’,10)->value(‘username’);

  • 列值

    $arr = User::column(“email”,”username”);//username = > email

  • 添加数据

    //post数据 $res = User::create([ “username”=>’damon’, “password”=>md5(‘pwd’), “email”=>’yank0362@qq.com’ ]);


    $res = User::create([ “username”=>’damon’, “password”=>md5(‘pwd’), “email”=>’yank0362@qq.com’ ],true);//过滤数据库中不存在的字段


    $res = User::create([ “username”=>’damon’, “password”=>md5(‘pwd’), “email”=>’yank0362@qq.com’ ],[‘username’,’email’]);//只更新配置的字段


    dump($res->id);//自增主键id dump($res);

    $userModel = new User; $userModel->username = ‘damon’; $userModel->password = ‘pwd’; $userModel->email=’yank0362@qq.com’; $res = $userModel->save();


    $userModel->allowField(true)->save([ “usename”=>”damon”, “password”=>”pwd”, “email”=>”email” ]);//过滤数据表中不存在字段


    $userModel->allowField([“username”])->save([ “usename”=>”damon”, “password”=>”pwd”, “email”=>”email” ]);//过滤数据表中不存在字段

    dump($userModel->id); //使用saveAll(二维数组),插入多条记录

  • 更新数据

    User::update([
    “id”=>1,
    “name”=>”damon”,
    “email”=>”yank0362@qq.com”
    ]);//根据传入的主键ID自动更新数据,无法知道影响行数,不常用,可以有第2参数,第2参数可以是闭包函数

    $res = User::where(“id”,”<“,5)->update([“username”=>”damon”,”email”=>”aa@q.com”]);
    //返回更新影响行数

    $userModel = User::get(1);
    $userModel->username=”damon”;
    $userModel->email=”aa@qq.com”;
    $res = $userModel->save();//返回影响行数

    $userModel = new User;
    $userModel->save([“email”=>”yank0362@qq.com”],[“id”=>5]);

  • 删除数据

    User::destroy(1);
    User::destroy([“id”=>2]);
    User::destroy(function($query){
    $query->where(“id”,”<“,5);
    });

    $userModel=User::get(5);
    $userModel->delete();

0

Thinkphp5数据库操作

  • 多行查询
Db::table('tbl')->select();//return []||二维数组
Db::table('tbl')->column('col');//return []||一维数组,如果存在第二个参数,则作为数组key
  • 单行查询
Db::table('tbl')->find();//return null||一维数组
Db::table('tbl')->value('name');//return null||string
  • Db::table() VS Db::name()
    Db::name()参数不需要写表前缀
Db::name('t1')->find();
db('t1',[],false)->find();//和上一种相同效果
  • 原生查询语句
$res = Db::query('select * from tbl where id=?',[100]);
$res = Db::execute('insert into tbl set a=?,b=?',['aa','bb']);
  • 插入操作
$res = Db::name('tbl')->insert([
    'username'=>'damon',
    'password'=>md5('pwd'),
    'email'=>'yank0362@qq.com'
]);//返回影响行数

$res = Db::name('tbl')->insertGetId([
    'username'=>'damon',
    'password'=>md5('pwd'),
    'email'=>'yank0362@qq.com'
]);//返回自增ID

$data = [];
foreach($i=0;$i++;$i<10){
    $data = [
        'username'=>"damon{$i}",
        'password'=>"pwd{$i}",
        'email'=>"email{$i}"
    ];
}
$res = Db::name('user')->insertAll($data);
  • 更新操作
$res = Db::name('user')->where(['id'=>1])->update(['username'=>'damon','password'=>'123']);//返回影响行数
$res = Db::name('user')->where(['id'=>1])->setField('username','damon');
$res = Db::name('user')->where(['id'=>1])->setInc('num',5);//每次增加5,返回影响行数
$res = Db::name('user')->where(['id'=>1])->setDec('num',5);//每次递减5,返回影响行数
  • 删除操作
$res = Db::name('user')->where(['id'=>1])->delete();//返回影响行数
$res = Db::name('use')->delete(1);//同上操作
  • 条件构造器
$sql = Db::name('user')->where("id",1)->buildSql();//返回sql语句
$sql = Db::name('user')->where("id",'lt',1)->buildSql();//<
$sql = Db::name('user')->where("id",'elt',1)->buildSql();//<=
$sql = Db::name('user')->where("id",'gt',1)->buildSql();//>
$sql = Db::name('user')->where("id",'egt',1)->buildSql();//>=
$sql = Db::name('user')->where("id",'in',"1,10,20")->buildSql();//in
$sql = Db::name('user')->where("id",'between',"1,20")->buildSql();//between
$sql = Db::name('user')->where("id"=>['in',[1,2,10,20]],"username"=>'damon')->buildSql();//返回id in '1,2,10,20' and username = 'damon'
$sql = Db::name('user')->where("id","EXP","not in (1,2,3)")->buildSql();
$sql = Db::name('user')->where("id","in","1,2,3")->whereOr("username","damon")->buildSql();id in (1,2,3) or username="damon"
  • 链式操作
$sql = Db::name('user')
->where('id','eq',10)
->field("username,password")
->order("id DESC")
//->limit(3)
->page(3,5)//分页
//->group('`group`')//分组
->select();
0

Thinkphp5 简单上手一

thinkphp5是一个全新的版本它不再兼容以前的版本,改动比较大。个人认为它很像YII2,如果你是YII2的老司机,上手tp5学习成本会比较小。TP5首次支持使用composer的方式安装,看起来更加具有现代框架的气质。本文不打算写成文档,虽然TP的官方文档值得呵呵。只记录一些个人觉得有点价值的东西和大家分享,希望能帮大家少踩一些坑~

1.关于dump方法(将变量,对象数组等以更友好的方式打印出来)

正常情况下dump打印出来的数组和变量是友好的,有适当的缩进排版。不过也有特珠的情况,如果你和我一样使用wampServer之类的在本机调试,很可能默认开启了Xdebug。解决方法是在php.ini当中关掉xdebug。

2.关于$_EVN(全局环境变量)打印出来是空的数组

解决方法依然是改php.ini将variables_order = "EGPCS",不过不推荐改配置,据说是影响性能,而且thinkphp5.0封装了一些获取环境变量的方法,更好的做法是在核心文件夹的同级创建.env文件,在里面以key=>value的方法如:

env_type=test

使用\think\Env::get("env_type")来获取值,利用这种方式可以方便在本机和服务器以及开发测试环境当中部署不同的配置文件

3.在tp5当中配置使用redis

首先在config.php当中加入redis的配置如下,可以从核心文件夹的惯例配置文件convention.php中复制,

return [
    'redis'=>[
        'host'      => '127.0.0.1',
        'port'      => 6379,
        'password'  => '',
        'select'    => 0,
        'timeout'    => 0,
        'expire'    => 0,
        'persistent' => false,
        'prefix'    => '',
        ],
];

然后就可以在控制器中使用如下代码方便的进行操作redis了

$opt = Config::get("redis");
$res = new Redis($opt);
$name = $res->get("name");
echo $name;
4.关于Request对象

Request请引入命名空间think\Request;

如下是常用的方法,就不一一解释了

dump($req->method());
dump($req->pathinfo());
dump($req->path());
dump($req->get());//普通get格式
dump($req->param());//pathinfo的参数
dump($req->post());
session("username","damon");
dump($req->session());
cookie("age",33);
dump($req->cookie());
dump($req->cookie('PHPSESSID'));
dump($req->module());
dump($req->controller());
dump($req->action());
dump($req->url());
dump($req->baseUrl());
5.关于改变Response类型

不推荐使用类似于echo json_encode($arr);之类的代码,推荐使用tp5提供的方式来改变返回类型,方法是改变配置项中的default_return_type

参考如下代码:

$res = [
    "code"=>100,
    "result"=>[
        "list"=>[1,2,3,4,5,6]
]
];
Config::set('default_return_type','xml');
//Config::set('default_return_type','json');
//Config::set('default_return_type','jsonp');
return $res;
6.打印所有的当前所有配置项
dump(config());
7.修改配置文件目录

修改public文件夹下的index.php当中代码,并在合适的目录新建配置文件目录

define('CONF_PATH', __DIR__.'/../conf/');
8.为各模块创建单独的配置文件,只对本模块有效

在配置文件目录中以模块名如admin创建子文件夹,并在子文件夹中新建config.php

9.在controller中传递变量,在view中接受变量
  • assign

    $this->assign(“aa”,”hahaha”);

  • fetch

    return $this->fetch(‘viewdemo’,[ ‘name’=>’hello’, ‘description’=>’world’ ]);

  • share

    \think\View::share(‘bb’,’bbb’);

在视图当中可以使用{$name} {$aa} {$description} 展示变量的值,视图中仍然支持原生的写法,更多的替换写法,请自行google或者参看文档

10.不使用模板渲染页面
return $this->display('hello,{$content}',[
    "content"=>"world!"
]);

hello,{$content}这段代码只能用单引号包裹,如果要用双引号请在$前面加上转义符\,否则会报错

11.修改模板引擎标签标记,来解决tp跟前端框架的冲突如vue.js等

解决方法:修改配置项

'tpl_begin' => '{',

// 模板引擎普通标签结束标记

'tpl_end'      => '}',
12.全局替换视图中的字符串

修改配置项

// 视图输出字符串内容替换
'view_replace_str'      => [
    'hello'=>'olleh'
],

完成以上配置,相关作用域的hello字符串将全部替换成olleh

13.在视图中使用引用css图片等资源

在视图中可以直接使用__ROOT__,__STATIC__,__CSS__,__JS__,__URL__等方式引用正确的路径

比如

<img src="__STATIC__/images/psb.jpg"/>
14.在视图中使用$Think访问系统变量

如:

$Think.session.name //获取session中的变量
$Think.cookie.age //获取cookie中的变量
$Think.server.HTTP_HOST //获取$_SERVER中的变量
$Think.get.id //获取get中的变量
$Think.post.email //获取post中的变量
$Think.const.APP_PATH//获取系统中的常量
$Think.APP_PATH等同于上面的方式
15.在模板当中使用注释
{/*

    我是模板注释kwgwgwgfdfdskfskdddsdffdfadfsdfddd

*/}
16.在视图中使用原生插入原生代码

在视图中可以使用< ?php ?>标签插入原生代码,或者使用{php} {/php}标签对,在当中插入普通的php代码即可

17.在视图中遍历数组的常用方法
  • volist

    {php} $empty = '没有数据';//当填充数据为空时,替换模板 {/php}
    
    {volist name="data" id="item" empty="$empty" key="i" offset="0" length="3" mod="1"} 
        {$i}=>{$item.name}--{$item.age} 
    {/volist}
    
  • foreach

    {foreach $data as $item} {$i}=>{$item.name}--{$item.age} {/foreach}
    
  • for

    {for start="1" end="10" step="2" name="i"} {$i}  
    {/for}
    
18.在视图中使用比较标签
  • eq(equal)

    {eq name="val1" value="11"} 等于11 {else/} 不等于11 {/eq}
    
  • neq

    {neq name="val1" value="10"} 不等于10 {else/} 等于10 {/neq}
    
  • gt

    {gt name="val1" value="5"} 大于5 {else/} 小于等于5 {/gt}
    
  • lt

    {lt name="val1" value="10"} 小于10 {else/} 大于等于10 {/lt}
    
  • egt

    {egt name="val1" value="10"} 大于等于10 {else/} 小于10 {/egt}
    
  • elt

    {elt name="val1" value="10"} 小于等于10 {else/} 大于10 {/elt}
    
  • 与变量的比较需要加上$符

    {eq name="val1" value="$val2"} val1 = val2 {/eq}
    
19.在模板中使用条件判断标签
  • switch

    {switch name="val1"}
       {case value="1"}1{/case}
       {case value="5"}5{/case} 
       {case value="10"}10{/case}
       {case value="15"}15{/case} 
       {case value="20"}20{/case}
       {case value="30|40|50"}30 or 40 or 50 {/case}
       {default/}0 
    {/switch}
    
  • range

    {range name="val2" type="in" value="1,2,3,4,5"} 
      val2 in vals 
        {else/} val2 not in vals 
    {/range}
    
  • in

    {in name="val2" value="1,2,3,4,5"} val2 in vals 
         {else/} val2 not in vals 
    {/in}
    
  • notin

    {notin name="val2" value="1,2,3,4,5"} val2 not in vals 
        {else/} val2 in vals 
    {/notin}
    
  • between

    {between name="val2" value="1,10"} val2 between 1-10 
        {else/} val2 notbetween 1-10 
    {/between}
    
  • notbetween

    {notbetween name="val2" value="1,10"} val2 notbetween 1-10 
        {else/} val2 between 1-10 
    {/notbetween}
    
  • defined

    {defined name="APP_PATH"} APP_PATH is defined. 
         {else/} APP_PATH is not defined. 
    {/defined}
    
  • if

    {if condition=" ($val2 != 2) AND ($val2 !=3) "} $val2 != 2 and $val2 !=3 
        {else/} $val2 = 2 or $val2 = 3 
    {/if}
    
20.在视图中使用布局文件

修改如下配置项,开启使用布局文件

'template'               => [
            'layout_on' => true,
            'layout_name' =>'layout',
        ],

TP5中使用布局文件的方式和YII2.0当中使用布局文件的方式几乎是一致的 布局文件中使用{__CONTENT__}代替具体渲染的view页面内容

21.使用include方式引用公共部分
{include file="common/footer"/}//将公共部分单独存放,使用include引入
22.在使用布局的页面中修改不同的页面标题
<title>{$title}</title><!---layout----->

$this->assign([
            'title'=>'page1'
]);//在对应的controller ->action中分配变量
0