# 模型动作 ## 介绍 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(); ```