多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
模型定义有几个要素: 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(); ~~~ 这里使用了模型关联的概念 * * * * * [参考链接](https://www.kancloud.cn/thinkphp/master-database-and-model/265556)