ThinkPHP5学习总结 系列二

一.数据库及模型.

方式一:原生sql查询

原生SQL操作支持query(查询操作)和execute(写入操作)方法,并且支持参数绑定。

Db::query('select * from think_user where id=?',[1]);
Db::execute('insert into think_user (id, name) values (?, ?)',[1,'thinkphp']);

或者采用字符串方式定义(字符串方式无法定义数据表前缀和连接参数),如下:

$result = Db::connect('mysql://root:12345@127.0.0.1:3306/thinkphp#utf8')->query('select * from think_data where id = 1');
dump($result);
方式二:使用查询构建器
// 插入记录
Db::table('think_data')
    ->insert(['id' => 18, 'name' => 'thinkphp', 'status' => 1]);

// 更新记录
Db::table('think_data')
    ->where('id', 18)
    ->update(['name' => "hello"]);

// 查询数据
$list = Db::table('think_data')
    ->where('id', 18)
    ->select();

// 删除数据
Db::table('think_data')
    ->where('id', 18)
    ->delete();

事物提交

Db::transaction(function(){
   Db::table('think_user')->find(1);
    Db::table('think_user')->delete(1);
});

手动控制事物

// 启动事务
Db::startTrans();
try{
    Db::table('think_user')->find(1);
    Db::table('think_user')->delete(1);
    // 提交事务
    Db::commit();    
} catch (\Exception $e) {
    // 回滚事务
    Db::rollback();
}

3.模型(model).

1.模型的定义

  1. 数据模型的名字,建议和数据表名一致。
  2. 如果不一致,可以在模型中设置表名。
  3. 如果表名中带有”_”(admin_user)模型名称应该是AdminUser。
<?php
    // 声明命名空间(位置)
    namespace app\index\model;
    // 导入系统的数据模型
    use think\Model;
    class User extends Model
    {
        // 设置查询的表
        protected $table="user";
        // 设置数据表主键protected $pk    = 'id';
        // 设置当前数据表的字段信息protected $field = [
        'id'          => 'int',
        'birthday'    => 'int',
        'status'      => 'int',
        'create_time' => 'int',
        'update_time' => 'int',
        'nickname', 'email',
    ];

    }

2.模型的基本操作

<?php

namespace app\admin\controller;

use think\Controller;
use app\admin\model\Admin as HomeAdmin;

class Home extends Controller
{
    //新增数据
    public function add()
    {
        $home = new  HomeAdmin();
        $home->username = '测试1号';
        $home->email = 'thinkphp@qq.com';
        if ($home->save()) {
            return '用户[ ' . $home->nickname . ':' . $home->id . ' ]新增成功';
        } else {
            return $home->getError();
        }
    }

    //删除数据
    public function delete($id)
    {
        $home = HomeAdmin::get($id);
        if ($home) {
            $home->delete();
            return '删除用户成功';
        } else {
            return '删除的用户不存在';
        }
    }

    //更新数据
    public function update($id)
    {
        $home = HomeAdmin::get($id);
        $home->nickname = '测试2号';
        $home->email = 'thinkphp2@qq.com';
        if (false !== $home->save()) {
            return '更新用户成功';
        } else {
            return $home->getError();
        }
    }

    //查询数据
    public function read($id = "")
    {
        $home = HomeAdmin::get($id);
        echo $home->nickname . '<br/>';
        echo $home->email . '<br/>';
    }
}

3.模型的读取器
读取器的作用是在获取数据的字段值后自动进行处理,例如要对userImage添加主机地址.

<?php

namespace app\admin\model;

use think\Model;

class Admin extends Model
{
    //使用getXXXAttr来读取
    public function getUserImageAttr($value, $data)
    {
        //$data里面包含表里面所有的字段,可以用这些字段来进行判断之类的.
        return config('setting.imgurl') . $value;
    }
}

4.隐藏显示模型字段
在使用php提供接口服务的时候,有些情况下数据表里的某些字段并不适合返回给前端人员,
所以我们需要对其进行隐藏。

class Category extends Model
{
        //隐藏如下的字段.
    protected $hidden = [
      'update_time','delete_time','from',
      'create_time','pivot','from','category_id',
      'img_id','summary'
    ];
}
class Category extends Model
{
        //只显示如下的字段.
    protected $visible = [
      'update_time','delete_time','from',
      'create_time','pivot','from','category_id',
      'img_id','summary'
    ];
}

thinkphp模型分层
hasOne:有一个,加上主谓语应该是 ,A 有一个 B
hasMany:有很多,A 有很多 B
belongsTo:属于, A 属于 B

一.异常.

1.对异常进行捕获将其抛出来.

 try {
            1 / 0;
        } catch (Exception $exception) {
            throw $exception;
        }

2.异常的分类.

1.由于用户行为导致的异常.

这种异常一般不需要记录日志,需要向用户返回具体的用户信息.

2.服务器自身的异常.

代码错误,调用外部接口错误.
这种异常通常需要记录日志,且不向客户端返回具体原因.

3.tp5捕获全局异常.

use Exception;
use think\exception\Handle;

class ExceptionHandler extends Handle
{
    public function render(Exception $e)
    {
        //全局所有的异常都会走到这个位置来
        return json("--------------------");
    }
}
image.png

一.验证器

1.验证器的使用.

  1. 在实例化的时候传入验证规则.
    $data = ["name" => "哈哈哈", "email" => "thinkphp@qq.com"];//要验证的数据
        //实例化验证器.传入验证规则
        $validate = new Validate([
            "name" => "require|max:10",
            "email" => "email"
        ]);
        //调用验证器的check方法对数据进行验证
        $result = $validate->check($data);
        if ($result) {
            //验证成功
        } else {
            //验证失败
            dump($validate->getError());
        }

2.rule方法动态添加规则.

 $data = ["name" => "哈哈哈", "email" => "php@qq.com"];//要验证的数据
        //验证规则
        $rules = [
            "name" => "require",
            "email" => "email"
        ];
        //实例化验证器
        $validate = new Validate($rules);
        //动态添加验证规则
        $validate->rule('name', 'max:10');
        $validate->rule([
            'email' => 'email',
        ]);
        //调用验证器的check方法对数据进行验证
        $result = $validate->check($data);
  1. 验证提示自定义.
namespace app\index\validate;

use think\Validate;

class User extends Validate
{
    //规则
    protected $rule =   [
        'name'  => 'require|max:25',
        'age'   => 'number|between:1,120',
        'email' => 'email',    
    ];
    //提示信息
    protected $message  =   [
        'name.require' => '名称必须',
        'name.max'     => '名称最多不能超过25个字符',
        'age.number'   => '年龄必须是数字',
        'age.between'  => '年龄只能在1-120之间',
        'email'        => '邮箱格式错误',    
    ];
}

二.自定义验证规则

系统内置了一些常用的规则,如果还不够用,可以自己扩展验证规则。
如果使用了验证器的话,可以直接在验证器类添加自己的验证方法

namespace app\index\validate;

use think\Validate;

class User extends Validate
{
    protected $rule = [
        'name'  =>  'isNotEmpty',
        'email' =>  'email',
    ];
    
    protected $message = [
        'name'  =>  '用户名不能为空',
        'email' =>  '邮箱格式错误',
    ];
    
    // 自定义验证规则
    //$value 验证数据
    //$rule 验证规则
    //$data 全部数据(数组)
    //$field字段名
      protected function isNotEmpty($value, $rule='', $data='', $field='')
    {
        if (empty($value)) {
            return $field . '不允许为空';
        } else {
            return true;
        }
    }
}

三.验证场景.

  1. 可以在定义验证规则的时候定义场景,并且验证不同场景的数据.
//规则
$rule = [
    'name'  => 'require|max:25',
    'age'   => 'number|between:1,120',
    'email' => 'email',
];
//提示信息
$msg = [
    'name.require' => '名称必须',
    'name.max'     => '名称最多不能超过25个字符',
    'age.number'   => '年龄必须是数字',
    'age.between'  => '年龄只能在1-120之间',
    'email'        => '邮箱格式错误',
];
//验证数据
$data = [
    'name'  => 'thinkphp',
    'age'   => 10,
    'email' => 'thinkphp@qq.com',
];
//实例化验证器
$validate = new Validate($rule);
//表示验证edit场景(该场景定义只需要验证name和age字段)
$validate->scene('edit', ['name', 'age']);
$result = $validate->scene('edit')->check($data);
  1. 如果使用了验证器,可以直接在类里面定义场景.
namespace app\index\validate;

use think\Validate;

class User extends Validate
{
    protected $rule =   [
        'name'  => 'require|max:25',
        'age'   => 'number|between:1,120',
        'email' => 'email',    
    ];
    
    protected $message  =   [
        'name.require' => '名称必须',
        'name.max'     => '名称最多不能超过25个字符',
        'age.number'   => '年龄必须是数字',
        'age.between'  => '年龄只能在1-120之间',
        'email'        => '邮箱格式错误',    
    ];
    
    protected $scene = [
        'edit'  =>  ['name','age'],
    ];
}

在需要验证的地方用:

$data = [
    'name'  => 'thinkphp',
    'age'   => 10,
    'email' => 'thinkphp@qq.com',
];

$validate = new \app\index\validate\User($rule);
$result = $validate->scene('edit')->check($data);

参考自:ThinkPHP5.0完全开发手册

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容