一.数据库及模型.
方式一:原生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.模型的定义
- 数据模型的名字,建议和数据表名一致。
- 如果不一致,可以在模型中设置表名。
- 如果表名中带有”_”(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("--------------------");
}
}
一.验证器
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);
- 验证提示自定义.
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;
}
}
}
三.验证场景.
- 可以在定义验证规则的时候定义场景,并且验证不同场景的数据.
//规则
$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);
- 如果使用了验证器,可以直接在类里面定义场景.
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);