数据库操作
最后更新于: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);
```
';