了解如何定义和调用模型后,我们来具体了解下模型的使用。
模型和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();
~~~