ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
* [统一示例](https://www.kancloud.cn/idcpj/python/1745576#_3) * [技巧](https://www.kancloud.cn/idcpj/python/1745576#_69) * [自定义不存在的字段](https://www.kancloud.cn/idcpj/python/1745576#_72) * [查询某条记录的某个值](https://www.kancloud.cn/idcpj/python/1745576#_83) * [带条件分页](https://www.kancloud.cn/idcpj/python/1745576#_91) * [插入前检查字段名](https://www.kancloud.cn/idcpj/python/1745576#_98) * [追加关联数组(紧接在数组后)](https://www.kancloud.cn/idcpj/python/1745576#_110) * [获取器](https://www.kancloud.cn/idcpj/python/1745576#_116) * [获取原始数据](https://www.kancloud.cn/idcpj/python/1745576#_147) * [修改器](https://www.kancloud.cn/idcpj/python/1745576#_156) * [时间戳](https://www.kancloud.cn/idcpj/python/1745576#_173) * [自定义时间戳](https://www.kancloud.cn/idcpj/python/1745576#_200) * [只读字段](https://www.kancloud.cn/idcpj/python/1745576#_210) * [软删除](https://www.kancloud.cn/idcpj/python/1745576#_223) * [类型转换](https://www.kancloud.cn/idcpj/python/1745576#_250) * [timestamp / datetime](https://www.kancloud.cn/idcpj/python/1745576#timestamp__datetime_277) * [数据完成](https://www.kancloud.cn/idcpj/python/1745576#_294) * [查询范围](https://www.kancloud.cn/idcpj/python/1745576#_317) * [参数支持](https://www.kancloud.cn/idcpj/python/1745576#_352) * [全局查询范围](https://www.kancloud.cn/idcpj/python/1745576#_369) ## 统一示例 ~~~ use think\Model; use traits\model\SoftDelete; class User extends Model{ // 软删除 use SoftDelete; //需要引入SoftDelete trait protected $deleteTime = 'delete_time'; // 时间戳写入 protected $autoWriteTimestamp = true; // 只读字段 protected $readonly = ['name', 'email']; //类型转 protected $type = [ 'status' => 'integer', 'score' => 'float', 'birthday' => 'timestamp:Y/m/d', 'info' => 'array', ]; //数据完成 protected $auto = []; protected $insert = ['ip', 'status' => 1]; // ip 回调用 setIpAttr 方法 protected $update = ['login_ip']; protected function setIpAttr(){ return request()->ip(); } // 修改器 public function setNameAttr($value){ return strtolower($value); } //获取器,可获取不存在字段 public function getStatusAttr($value){ $status = [-1 => '删除', 0 => '禁用', 1 => '正常', 2 => '待审核']; return $status[$value]; } // 定义全局的查询范围 protected function base($query){ $query->where('status', 1); } protected function scopeThinkphp($query){ $query->where('name', 'thinkphp')->field('id,name'); } protected function scopeAge($query){ $query->where('age', '>', 20)->limit(10); } } ~~~ ## 技巧 ### 自定义不存在的字段 ~~~ //$data 为该条记录数组 public function getLoanRateAttr($value,$data){ $loan = LoanModel::get($data['id']); $value = "参考".$loan['time_type']."利率: ".strval($value)."%"; return $value; } ~~~ ### 查询某条记录的某个值 ~~~ //使用 ->value $loanTypeId = LoanTypeModel::where(['name' => $loanTypeId])->value('id'); //返回 字符串 3 //如果是colunm 则是对多条记录返回值 ~~~ ### 带条件分页 ~~~ $loanData = LoanModel::where($where)->paginate(10,false,[ 'query'=>$this->request->param(), ]); ~~~ ### 插入前检查字段名 ~~~ fields_strict' => true, //检查字段名 //异常可以用异常捕获 try{ OrderModel::create($saveData); } catch(\Exception $e){ show($e->getMessage(),10004); } ~~~ ### 追加关联数组(紧接在数组后) ~~~ //只是针对 单条记录 $order = OrderModel::get(1)->appendRelationAttr('loan', 'max_money,min_money'); ~~~ ### 获取器 获取器的作用是在获取数据的字段值后自动进行处理 ~~~ class User extends Model { public function getStatusAttr($value) { $status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核']; return $status[$value]; } } // 使用 $user = User::get(1); echo $user->status; // 例如输出“正常” ~~~ 获取器还可以定义数据表中不存在的字段 ~~~ class User extends Model { public function getStatusTextAttr($value,$data) { $status = [-1=>'删除',0=>'禁用',1=>'正常',2=>'待审核']; return $status[$data['status']]; } } // 使用 $user = User::get(1); echo $user->status_text; // 例如输出“正常” ~~~ #### 获取原始数据 ~~~ $user = User::get(1); // 获取原始字段数据 echo $user->getData('status'); // 获取全部原始数据 dump($user->getData()); ~~~ ### 修改器 修改器的作用是可以在数据赋值的时候自动进行转换处理 ~~~ class User extends Model { public function setNameAttr($value) { return strtolower($value); } } // 使用 $user = new User(); $user->name = 'THINKPHP'; $user->save(); echo $user->name; // thinkphp ~~~ ### 时间戳 ~~~ // 全局开启自动写入时间戳字段 'auto_timestamp' => true, // 在模型中开启 protected $autoWriteTimestamp = true; ~~~ 如果这两个地方设置为true,默认识别为整型int类型,如果你的时间字段不是int类型的话,例如使用datetime类型的话,可以这样设置: ~~~ // 开启自动写入时间戳字段 'auto_timestamp' => 'datetime', //or protected $autoWriteTimestamp = 'datetime'; ~~~ 字段名默认创建时间字段为create\_time,更新时间字段为update\_time demo ~~~ $user = new User(); $user->name = 'THINKPHP'; $user->save(); echo $user->create_time; // 输出类似 2016-10-12 14:20:10 echo $user->update_time; // 输出类似 2016-10-12 14:20:10 ~~~ ### 自定义时间戳 ~~~ class User extends Model { // 定义时间戳字段名 protected $createTime = 'create_at'; protected $updateTime = 'update_at'; } ~~~ ### 只读字段 只读字段 ~~~ namespace app\index\model; use think\Model; class User extends Model { protected $readonly = ['name','email']; } ~~~ ### 软删除 对数据频繁使用删除操作会导致性能问题,软删除的作用就是把数据加上删除标记,而不是真正的删除,同时也便于需要的时候进行数据的恢复 ~~~ namespace app\index\model; use think\Model; use traits\model\SoftDelete; class User extends Model { use SoftDelete; //需要引入SoftDelete trait protected $deleteTime = 'delete_time'; } ~~~ 使用 ~~~ // 软删除 User::destroy(1); // 真实删除 User::destroy(1,true); $user = User::get(1); // 软删除 $user->delete(); // 真实删除 $user->delete(true); ~~~ ### 类型转换 会在**写入和读取**的时候自动进行类型转换处理 ~~~ class User extends Model { protected $type = [ 'status' => 'integer', 'score' => 'float', 'birthday' => 'datetime', 'info' => 'array', ]; } // 使用 $user = new User; $user->status = '1'; $user->score = '90.50'; $user->birthday = '2015/5/1'; $user->info = ['a'=>1,'b'=>2]; $user->save(); var_dump($user->status); // int 1 var_dump($user->score); // float 90.5; var_dump($user->birthday); // string '2015-05-01 00:00:00' var_dump($user->info);// array (size=2) 'a' => int 1 'b' => int 2 ~~~ #### timestamp / datetime timestamp 写入时为时间戳,读取时默认为默认的格式为`Y-m-d H:i:s` 自定义时间格式 ~~~ class User extends Model { protected $type = [ 'status' => 'integer', 'score' => 'float', 'birthday' => 'timestamp:Y/m/d', ]; } ~~~ datetime 写入和读取数据的时候都会自动处理成时间字符串`Y-m-d H:i:s`的格式 ### 数据完成 系统支持`auto`、`insert`和`update`三个属性,`auto`包含`insert`和`update` namespace app\\index\\model; ~~~ namespace app\index\model; use think\Model; class User extends Model { protected $auto = []; protected $insert = ['ip','status' => 1]; // ip 回调用 setIpAttr 方法 protected $update = ['login_ip']; protected function setIpAttr() { return request()->ip(); } } ~~~ ### 查询范围 > [参考](https://www.kancloud.cn/manual/thinkphp5/138865) ~~~ namespace app\index\model; use think\Model; class User extends Model { protected function scopeThinkphp($query) { $query->where('name','thinkphp')->field('id,name'); } protected function scopeAge($query) { $query->where('age','>',20)->limit(10); } } // 使用 // 查找name为thinkphp的用户 User::scope('thinkphp')->find(); // 查找年龄大于20的10个用户 User::scope('age')->select(); // 查找name为thinkphp的用户并且年龄大于20的10个用户 User::scope('thinkphp,age')->select(); ~~~ #### 参数支持 ~~~ namespace app\index\model; use think\Model; class User extends Model { protected function scopeAgeAbove($query, $lowest_age) { $query->where('age','>',$lowest_age)->limit(10); } } User::scope('ageAbove', 20)->select(); ~~~ #### 全局查询范围 ~~~ namespace app\index\model; use think\Model; class User extends Model { // 定义全局的查询范围 protected function base($query) { $query->where('status',1); } } // 使用 $user = User::get(1); 最终的查询条件会是 status = 1 AND id = 1 // 关闭全局查找 User::useGlobalScope(false)->get(1); ~~~ 点赞