ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 框架有两种方式实现sqlCURD操作: 查询构造器和ORM ORM:就像名字叫的,对象关系映射,放在项目里面来看就是数据实体的model,也可以理解成持久化的类,使用oop思想。 查询构造器:就常用的数据库Query类方法,其实就是原生、pdo等的实现和使用,两相比较的话,使用ORM更适合快速开发,例如,你使用laravel等框架,可以几条命令就生成好对应的model和控制器了以及CURD操作了。具体使用,根据业务场景和自己熟悉程度取用就好。 ## **定义:** >[info] 单应用模式 > app/model/User.php ~~~ <?php namespace app\model; use think\Model; class User extends Model { // 模型初始化 protected static function init() { //TODO:初始化内容 } } ~~~ >[info] 多应用模式 > app/index/model/User.php ``` <?php namespace app\index\model; use think\Model; class User extends Model { // 模型初始化 protected static function init() { //TODO:初始化内容 } } ``` ## **获取模型类** ``` //use app/index/model/User $user=new User(); ``` ## **常规属性** ``` <?php namespace app\index\model; use think\Model; class User extends Model{ /** * 假设你在数据库配置文件设置了数据表前缀prefix为think_,且模型类文件名与模型类名一致的情况下: * 模型名User(即User类)对应的表名think_user * 模型名UserType对应的表名是think_user_type * tp会优先选择table属性,当table属性未被设置时用前缀与name属性组装表名 * * 如果你的模型名与你想要查询的数据表名不一致请斟酌设置以下两个属性 * 如:你的模型名为User而你的数据表为think_member则设置如下 * */ //设置表名 protected $table = 'think_member'; //模型名 protected $name = 'user'; /** * 主键id Tp默认主键为id, * 如果你没有使用id作为主键名,需要在这里设置真实的数据表id */ protected $pk = 'id'; /** * 设置当前模型的数据库连接 connections下默认的为mysql * 将值改为db_config后则需要在配置文件增加db_config配置项 * database.php配置:'connections'=> ['mysql'=>[...],'db_config'=>[...]] * @var string */ protected $connection = 'db_config'; /** * 定义默认的表后缀(默认查询中文数据) 几乎不怎么用 * * 还可以是用suffix()查询和setsuffix()动态设置 * suffix()动态查询 * $blog = Blog::suffix('_en')->find(); * setSuffix用于动态设置 * $blog = new Blog($data); * $blog->setSuffix('_en')->save(); */ protected $suffix = '_cn'; /** * 是否严格区分字段(模型数据)大小写,默认为true(不推荐) * 当设置为true时 $user->createTime;与$user->create_time;等效 * 默认为true时 当前$user对象属性名与表字段一致才能调用成功 * @var boolean */ protected $strict = false; /** * 模型字段 与 字段类型 * 设置模型字段信息 模型的数据字段和对应数据表的字段是对应的,默认会自动获取(包括字段类型), * 但自动获取会导致增加一次查询,因此你可以在模型中明确定义字段信息避免多一次查询的开销 * * schema属性一旦定义,就必须定义完整的数据表字段类型 */ //模型字段 protected $schema = [ 'id' => 'int', 'name' => 'string', 'status' => 'int', 'score' => 'float', 'create_time' => 'datetime', 'update_time' => 'datetime', ]; // 设置字段自动转换类型 实际的字段或者字段别名 protected $type = [ 'score' => 'float', ]; /** * 设置废弃字段(忽略的字段) * @var [type] */ protected $disuse = [ 'status', 'type' ]; } ``` ## **模型方法依赖注入** 如果你需要对模型的方法支持依赖注入,可以把模型的方法改成闭包的方式,例如,你需要对获取器方法增加依赖注入 ~~~ public function getTestFieldAttr($value,$data) { return $this->invoke(function(Request $request) use($value,$data) { return $data['name'] . $request->action(); }; } ~~~ 不仅仅是获取器方法,在任何需要依赖注入的方法都可以改造为调用`invoke`方法的方式,`invoke`方法第二个参数用于传入需要调用的(数组)参数。 如果你需要直接调用某个已经定义的模型方法(假设已经使用了依赖注入),可以使用 ~~~ protected function bar($name, Request $request) { // ... } protected function invokeCall(){ return $this->invoke('bar',['think']); } ~~~