数据库操作

最后更新于:2022-04-02 02:22:12

[TOC] ## 统一示例 ``` 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); ```
';