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完全开发手册

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容