# 模型動作
## 介紹
HDPHP 實現了ActiveRecords模式的ORM模型,表映射到類,記錄映射到對象。最大的特點就是使用方便和便于理解(因為采用了對象化),提供了開發的最佳體驗,從而達到敏捷開發的目的。
如果數據庫表里有 updated_at 和 created_at 兩個字段,可以通過模型自動操作這兩個字段,只要將模型屬性 $timestamps 屬性設為 true 即可。
[TOC]
## 數據庫組件
模型繼承了 [Db數據庫管理組件](http://www.hmoore.net/houdunwang/hdphp3/215182) 所以 [Db](http://www.hmoore.net/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.hmoore.net/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.hmoore.net/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
- 啟動與關閉
- 前端
- 微信