# 模型动作
## 介绍
HDPHP 实现了ActiveRecords模式的ORM模型,表映射到类,记录映射到对象。最大的特点就是使用方便和便于理解(因为采用了对象化),提供了开发的最佳体验,从而达到敏捷开发的目的。
如果数据库表里有 updated_at 和 created_at 两个字段,可以通过模型自动操作这两个字段,只要将模型属性 $timestamps 属性设为 true 即可。
[TOC]
## 数据库组件
模型继承了 [Db数据库管理组件](http://www.kancloud.cn/houdunwang/hdphp3/215182) 所以 [Db](http://www.kancloud.cn/houdunwang/hdphp3/215182) 中的所有方法都可以调用,调用时可以直接使用静态方式调用 News::find(3) 。
## 查询
因为更多情况下面查询条件都是以主键或者某个关键的字段。这种类型的查询,HDPHP 有着很好的支持。 先举个最简单的例子,假如我们要查询主键为8的某个用户记录,如果按照之前的方式,我们可能会使用下面的方法:
```
// 查找id为8的用户数据,返回值为数组
User::where('uid',8)->find();
```
现在可以直接写成:
```
//返回值为模型对象
User::find(8);
//将结果以数组返回
User::find(8)->toArray();
```
#### findOrFail
找不到记录时显示404页面
~~~
User::findOrFail(8);
~~~
## 新增
新增数据后当前模型实例将与新增记录使用ORM关系,即当前模型包括新增数据。返回值为自增的主键编号。
所谓新增就是添加的数据中不含有主键数据。
```
$Model = new User();
//然后直接给数据对象赋值
$Model['name'] = 'hdphp';
$Model['email'] = 'houdunwang@126.com';
//把数据对象添加到数据库
$Model->save();
```
## findOrCreate
根据主键编号创建模型,当记录不存在时创建新的空模型。
~~~
User::findOrCreate(3)
~~~
## 更新
#### 更新找到的数据
要更新模型前必须先取出它,然后使用 save 方法完成更新操作。
```
$model = News::find(1); // 查找主键为1的数据
$model->title = 'hdphp'; // 修改数据对象
$model->save(); // 保存当前数据对象
```
#### 结合查询语句更新
使用查询语句更新是使用的 [Db数据库管理组件](http://www.kancloud.cn/houdunwang/hdphp3/215182) 操作而不经过模型处理,所以将不会执行自动验证,自动过滤,自动完成等操作。
```
$model->where('id', '>', 100)->update(['cid' => 2]);
```
#### 更新模型的时间戳
需要设置模型属性 $timestamps 为true才可以成功执行本指令。使用 [carbon](http://carbon.nesbot.com) 组件进行时间管理
```
$model = News::find(1);
$model->touch();
//表中需要存在 updated_at 字段
```
## 删除
#### 删除当前模型数据
可以删除当前模型的数据,这时的模型等同于一个新模型,模型没有与表记录进行关联。
```
$model =News::find(3);
//删除当前的数据对象
$model->destory();
```
#### 使用 [Db数据库管理组件](http://www.kancloud.cn/houdunwang/hdphp3/215182)删除
模型内部使用了Db组件,所以Db组件中的所有方法都可以使用,当然包括删除动作。
```
// 删除主键为8的数据
News::delete(8);
// 删除主键为5、6的多个数据
News::delete('5,6');
```
## 字段后处理
用于读取数据成功时的对字段的处理后返回,比如我们想把字段 data 在查询后进行 json_decode 处理,那么在模型中定义以下方法就可以了。
~~~
public function getDataAtAttribute($val)
{
return json_decode($val, true) ?: '';
}
~~~
## 错误处理
系统会将错误信息保存在模型的 **error** 属性中,开发者也可以在模型方法中保存错误到 error 属性中,这些错误都可以通过 getError()模型方法获取到。
```
$model->getError();
```
- 文档已经迁移到后盾人
- 介绍
- 框架特性
- 开发规范
- 许可协议
- 作者向军
- 安装框架
- 更新框架
- 基础
- 入口文件
- 应用配置
- 优雅链接
- 目录结构
- 系统常量
- 自动加载
- 应用密钥
- 系统函数
- CSRF保护
- 依赖注入
- 跨域访问
- 配置
- 配置文件
- 基本功能
- 扩展配置
- c 函数
- 控制器
- 定义声明
- 基本使用
- 相关函数
- 响应消息
- 路由
- 基础知识
- 基础路由
- 路由参数
- 参数检测
- 依赖注入
- 控制器
- 分组路由
- RESTful
- 别名路由
- 数据
- 配置相关
- 核心操作
- 查询构造器
- 日志记录
- 分页处理
- 事务处理
- 函数相关
- 数据库
- 数据迁移
- 数据填充
- 模型
- 定义模型
- 模型动作
- 模型验证
- 自动完成
- 自动过滤
- 字段保护
- 数据填充
- 多表关联
- 分页处理
- 仓库
- 数据仓库
- 查询规则
- 视图
- 基础知识
- 模板配置
- 模板文件
- 分配数据
- 系统标签
- 扩展标签
- 缓存模板
- 模板继承
- 视图函数
- widget
- vue组件
- 中间件
- 中间件
- 缓存
- 基本操作
- 文件缓存
- 数据表缓存
- 服务
- 服务容器
- 定制服务
- 相关函数
- 请求
- 基本使用
- 请求扩展
- 测试
- 基础知识
- 基本使用
- HTTP测试
- 调试
- 调试模式
- 日志管理
- 组件
- 多语言
- 响应处理
- Cookie
- Session
- 验证码
- XML
- 自动验证
- 文件处理
- 压缩解压
- RBAC
- 数组增强
- 分页管理
- 图像处理
- 生成静态
- 加密解密
- 字符串
- 数据集合
- 工具服务
- 目录操作
- 邮件发送
- CURL
- QQ登录
- 数据备份
- 购物车
- 日志处理
- 命令组件
- 二维码
- 后盾云
- 日期处理
- 阿里
- 支付宝
- 阿里云直播
- 阿里云短信
- 阿里云邮件
- 阿里云OSS
- SOCKET
- 启动与关闭
- 前端
- 微信