了解如何定義和調用模型后,我們來具體了解下模型的使用。
模型和Db操作的一大顯性區別就是一個是對象操作和一個是數組操作,下面以一個user數據表的查詢、取值、設置和更新的例子,來說明下兩種方式的區別。
首先回顧下Db類的用法:
~~~
// 查詢操作
$user = Db::table('user')->find(1);
// 取值操作
echo $user['name'];
echo $user['email'];
// 設置操作
$user['name'] = 'topthink';
$user['email'] = 'thinkphp@qq.com';
// 更新操作
Db::table('user')->update($user);
~~~
如果是模型操作的話,可以:
~~~
// 查詢操作
$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');
~~~
以name屬性為例,獲取模型數據的方式有下列三種:
|場景|方法|
| --- | --- |
|外部獲取模型數據|$model->name|
|內部獲取模型數據|$this->getAttr('name')|
| 內部獲取(原始)模型數據|$this->getData('name')|
getData和getAttr方法的區別前者是原始數據,后者是經過讀取器處理的數據,如果沒有定義數據讀取器的話,兩個方法的結果是相同的。
對應的設置模型數據的方式也有三種:
|場景|方法|
| --- | --- |
|外部設置模型數據|$model->name='thinkphp'|
|內部設置模型數據(經過修改器)|$this->setAttr('name','thinkphp')|
|內部設置模型數據|$this->data('name','thinkphp')|
data和setAttr方法的區別前者是賦值最終數據,后者賦值的數據還會經過修改器處理,如果沒有定義修改器的話,兩個方法的結果是相同的。
對象化操作的神奇是可以級聯讀取或者設置,例如:
~~~
// 查詢操作
$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();
~~~