模型定义有几个要素:
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|
如果你的对应规则和上面的系统约定不符合,那么需要设置模型类的数据表名称属性,以确保能够找到对应的数据表。
代码如下:
~~~
namespace app\index\model;
use think\Model;
class User extends Model
{
protected $table = 'user_info';
}
~~~
table属性定义的是完整数据表名,如果你希望定义不带前缀的数据表名,可以使用name属性来定义模型的名称。
~~~
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();
~~~
这里使用了模型关联的概念
* * * * *
[参考链接](https://www.kancloud.cn/thinkphp/master-database-and-model/265556)