ThinkPHP5的模型是一種對象-關系映射(Object / Relation Mapping ,簡稱 ORM)的封裝,並且提供了簡潔的ActiveRecord實現。一般來說,每個數據表會和一個“模型”對應。
ThinkPHP5 模型類和Db類的區別主要在於對象的封裝,Db類的查詢默認返回的是數組(或者集合),而模型類返回的是當前的模型對象實例(或者集合),模型是比Db類更高級的數據支持模型關聯、模型事件。

ThinkPHP5 模型屬性$table 不再是包含表前綴的表名;$name則是包含表前綴的表名。
一般來說,模型的屬性名 就是對應的數據表的字段名。
Model模型類
· protected $name; //包含表前綴的數據表
· protected $table; //不包含表前綴的數據表,使用的時候要加上表前綴
如: protected $table = ‘tp_admin_user’;
模型類 的public類型屬性 就是對應的表的字段名。如果給模型類的屬性不對應字段名的話,會報錯。
$user = new User; // User為模型類
$user->user_name = ‘admin’; // user表 user_name 字段
$user->password = md5(‘123456’); // user表 password 字段
$user[‘user_name’] 等同 $user->username;
疑惑:如果此時使用save()方法,會是修改 還是 什么情況?
$user->save(); //此時為新增!!!
因為當 $user對象沒有給定 主鍵的時候,此時為新增; 如果給定主鍵,此時為修改!
另外一種新增數據為 模型::create();
那么問題來了,什么時候使用save() 或 create()呢?
·新增數據

由此可見,當實例化模型的時候,使用 save() 或 saveAll() 方法進行添加。
如果使用 模型類, 就使用 XXModel::create(); 進行添加
$user = new User; // User為模型類
此時$user->save($data) 或 User::create($data); 兩者返回的還是模型的實例化對象,不同的是User模型類create()后 返回的是 新new的對象而已。
--------------------------------------------
批量新增數據

實際操作的時候,是執行了多條的insert into 數據。並非真的一次性插入。
查詢

· getBy字段名(); 查詢對應的單條查詢,字段名第一個字母要大寫!
如: 查詢 level_id字段的值為4的這條信息
$user->getByLevelId(4);
如:查詢 name 字段的值為 admin的這條信息
$user->getByName(‘admin’);
$user = new User; //User 為模型類
$user->getBy字段名(‘值’); //返回當前 字段名= 值 的這條信息.
$user->getData(); //可以將單條信息 轉換為 數組
注意:getBy字段名(), 如果字段名有”_”, 同樣將首字母和_后的首字母轉為大寫!!!
·get() 可查詢主鍵 或 非主鍵
如:查詢主鍵為1的單條信息
$user->get(1);
如:表沒有主鍵,可使用數組來傳遞查詢
$data = [‘name’=>’site_name’];
$user->get($data); //查詢沒有主鍵的 單條數據
或 使用 where為追加條件
$map = ['level_id'=>2];
$result3 = $model->where($map)->find();
更改

$user = new User; //User為模型類
$user->save($data, $where條件);
Model::update($dasta, $where條件);
上面講過,如果沒有給定主鍵 此時 $user->save(); 為新增,如果當表中沒有主鍵怎么辦?
$user->isUpdate(true)->save(); //強制為更新操作
以下內容為知識擴展,不要拿到實戰中,否則潛在問題會困擾很久!!
還有一種情況是 $user = User::get(1); $data = [.. ...]; 如果沒有給定主鍵,是新增嗎?
答案是修改!!! 因為$user 是 User::get(1)返回的對象,1就是主鍵,所以此時為修改,並非進行新增操作!!!
問題又來了,如果我現在就想把$user->save($data); 為新增,該怎么操作?
答: $user->主鍵 = NULL; 再 $user->isUpdate(false)->save($data); 此時為新增操作。
問題又來了,新增后的數據信息,除了主鍵,$data中不存在的信息,則是復制User::get(1)默認的數據!!!!! 這招太坑
最好使用 Model::create() 或 干脆直接new Model 再save(),一般不建議使用 User::get(1) 這種直接返回實例化的對象 再進行CURD;
刪除操作

Model::destory(主鍵id);
如: User::destroy(33); // 刪除主鍵33的單條信息
對象->where(條件)->delete();
如: $user->where(‘id =5 ’)->delete(); //刪除主鍵5的單條信息
學習模型總結:
·新增數據
·批量新增
·查詢數據
·數據列表
·更新數據
·刪除數據
小技巧總結:
·獲取模型類對應表的字段名, new 模型類,再使用 屬性進行相關操作
如: $user = new User; //User為模型類
$user->user_name 與 $user[‘user_name’] 等同!!
因為基類Mode類 implements \ArrayAccess , 可以將屬性當成數組的形式來訪問。
·數據表存在“_”的問題
如果數據表存在下划線,將下划線去掉,模型的名字首字母大寫。
如: tp_admin_user, 對應的模型名 AdminUser .
·如果數據表 與 當前模型名稱不一致,怎么辦?
在模型類內 protected $name =”要關聯的表名”;
如: tp_admin_user, User模型 protected $name = ‘user’;
·模型類 或 模型對象 get() 或 find() 查詢后的結果 怎么轉成數組?
通過 getData()方法,
如: $result = $user->find(1); $result->getData();
·模型類 或 模型對象 all() 或 select() 查詢后的結果 怎么轉數組?
此時查詢的多條信息為 結果集!! 不能使用getData()一次性轉數組,
可以使用foreach() 來逐條轉為數組,但太麻煩!!!。
通過 collection(結果集)->toArray();
如: $result = $user->select(); $data = collection($result)->toArray();
