模型定義有幾個要素:
1. 通常會繼承think\Model(或者子類),虛擬模型除外;
2. 一個模型并不總是對應一個數據表(可能會有多個),雖然默認如此;
3. 模型名和數據表名也不是直接對應關系;
4. 盡管一個空模型和使用Db類無異,但意義不同;
模型定義階段要達成的目的:
1. 定義數據表(默認就是模型類名)
2. 定義數據表主鍵(默認會自動獲取)
3. 定義數據庫連接(默認使用數據庫配置)
4. 定義數據處理邏輯(包括屬性和方法)
5. 定義業務邏輯(方法)
下面的定義是不需要或者不支持的:
1. 數據表字段(不需要,會自動獲取,并支持緩存機制)
2. 數據表前綴(不支持,模型不關心前綴)
大多數情況下,數據表和數據庫連接是不需要定義的,**數據處理邏輯和業務邏輯才是模型定義的重點**,如果你發現你的大多數模型類都是什么都沒定義,那么就要思考下哪里出問題了,為什么你的模型成了形式和擺設。是沒業務需要還是職責分工有問題了?也許你在控制器中大量使用Db類進行業務邏輯處理。無論怎樣,現在糾正思維,跟著教程擁抱和學習模型吧。
一個模型并不總是對應一個數據表(例如關聯模型和聚合模型),但大多數情況下對應的是一個數據表,默認的對應關系是:模型類的名稱(注意不一定是類名,后面會解釋)轉換為小寫和下劃線就是對應的數據表:
|模型名 |對應數據表|
|--|--|
|User |user|
|UserType |user_type|
如果你的數據庫配置定義了前綴(假設數據庫的前綴定義是 think_),那么對應關系就是:
|模型名 |對應數據表|
|--|--|
|User |think_user|
|UserType |think_user_type|
如果你的對應規則和上面的系統約定不符合,那么需要設置模型類的數據表名稱屬性,以確保能夠找到對應的數據表。
代碼如下:
~~~
<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
protected $table = 'user_info';
}
~~~
table屬性定義的是完整數據表名,如果你希望定義不帶前綴的數據表名,可以使用name屬性來定義模型的名稱。
~~~
<?php
namespace app\index\model;
use think\Model;
class User extends Model
{
protected $name = 'user_info';
}
~~~
如果你同時定義了這兩個屬性,那么table屬性是優先的。
調用模型類的方法其實和調用一個普通的類沒有區別,不要覺得模型類有什么特殊。
模型操作的話,就可以對應下面的代碼實現:
~~~
// 查詢操作
$user = User::get(1);
// 取值操作
echo $user->name;
echo $user->email;
// 設置操作
$user->name = 'topthink';
$user->email = 'thinkphp@qq.com';
// 更新操作
$user->save();
~~~
事實上,由于模型類實現了ArrayAccess接口,因此一樣可以使用數組方式操作:
~~~
// 查詢操作
$user = User::get(1);
// 取值操作
echo $user['name'];
echo $user['email'];
// 設置操作
$user['name'] = 'topthink';
$user['email'] = 'thinkphp@qq.com';
// 更新操作
$user->save();
~~~
如果是在模型內部進行取值和設置操作怎么辦?正確的獲取方式應該是:
~~~
// 模型內部讀取數據
echo $this->getData('name');
echo $this->getAttr('email');
// 模型內部設置數據
$this->data('name','thinkphp');
$this->setAttr('email','thinkphp@qq.com');
~~~
對象化操作的神奇是可以級聯讀取或者設置,例如:
~~~
// 查詢操作
$user = User::get(1);
// 取值操作
echo $user->name;
echo $user->email;
// 關聯取值
echo $user->role->name;
echo $user->contact->phone;
// 設置操作
$user->name = 'topthink';
$user->email = 'thinkphp@qq.com';
// 更新操作
$user->save();
// 關聯設置
$user->role->name = 'admin';
$user->role->save();
$user->contact->phone = '123456789';
$user->contact->save();
~~~
這里使用了模型關聯的概念
* * * * *
[參考鏈接](http://www.hmoore.net/thinkphp/master-database-and-model/265556)