# Model 模型 ## 模型的定义 创建了一个User.php模型 ```bash php8 artisan make:model User ``` ```php 'UTC', 'timezone' => 'Asia/Shanghai', // 'locale' => 'en', 'locale' => 'zh_CN', ``` 新增 ```php // 默认模型接管created_at和updated_at $users = new User(); $users->name = '曹操'; $users->age = 23; $users->save(); // insert into `user` (`name`, `age`, `update_time`, `create_time`) values (?, ?, ?, ?) // 需要在模型端设置批量赋值的许可 // protected $fillable = [] //如果取消批量赋值限制,直接如下 // protected $guarded = []; User::create([ 'name' => '曹真', 'age' => 23 ]); // insert into `user` (`name`, `age`, `update_time`, `create_time`) values (?, ?, ?, ?) ``` 更新 ```php $users = User::find(1); $users->name = '曹丕'; $users->save(); // select * from `user` where `user`.`id` = ? limit 1 // update `user` set `name` = ?, `user`.`update_time` = ? where `id` = ? // 批量更新 User::where('name', '曹真') ->update([ 'name' => '曹爽' ]); // update `user` set `name` = ?, `user`.`update_time` = ? where `name` = ? ``` 删除 ```php $users = User::find(1); $users->delete(); // select * from `user` where `user`.`id` = ? limit 1 // delete from `user` where `id` = ? //批量删除 User::where('name', '曹爽')->delete(); // delete from `user` where `name` = ? // 通过主键删除 User::destroy(2); // delete from `user` where `id` = ? User::destroy([2, 3, 4]); // select * from `user` where `id` in (?, ?, ?) ``` ## 批量赋值 设置 create 方法允许或不允许插入的数据字段 ```php class User extends Model { // 可批量赋值的属性 protected $fillable = ['name']; // 不可以批量赋值的属性 protected $guarded = ['name']; // 所有属性都可以批量赋值,$guarded 定义成一个空数组 protected $guarded = []; } ``` ## 软删除 ```sql CREATE TABLE `user` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL, `age` int NOT NULL DEFAULT '0', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `delete_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB COMMENT='用户表'; ``` ```php class User extends Model { //开启软删除功能 use SoftDeletes; // 软删除字段,默认deleted_at const DELETED_AT = 'delete_time'; } ``` ```php //删除一 $user = User::find(1); $user->delete(); // select * from `user` where `user`.`id` = ? and `user`.`delete_time` is null limit 1 // update `user` set `delete_time` = ?, `user`.`update_time` = ? where `id` = ? //删除二 User::destroy(2); // select * from `user` where `id` in (?) and `user`.`delete_time` is null // update `user` set `delete_time` = ?, `user`.`update_time` = ? where `id` = ? //软删除的数据不可见 User::get(); // select * from `user` where `user`.`delete_time` is null User::find(2); // select * from `user` where `user`.`id` = ? and `user`.`delete_time` is null limit 1 // 获取包含软删除的数据 User::withTrashed()->get(); // select * from `user` // 获取某个被软删除的数据(即使不是软删除的也可以搜索到) User::withTrashed()->find(82); // select * from `user` where `user`.`id` = ? limit 1 // 获取所有软删除的数据 User::onlyTrashed()->get(); // select * from `user` where `user`.`delete_time` is not null // 获取某个被软删除的数据(只有软删除的数据才可以被搜索到) User::onlyTrashed()->find(82); // select * from `user` where `user`.`delete_time` is not null and `user`.`id` = ? limit 1 // 判断是否是被软删除的数据 $user = User::withTrashed()->find(1); $user->trashed(); // 1 // select * from `user` where `user`.`id` = ? limit 1 // 将被软删除的数据回复正常 $user = User::onlyTrashed()->find(2); $user->restore(); // select * from `user` where `user`.`delete_time` is not null and `user`.`id` = ? limit 1 // update `user` set `delete_time` = ?, `user`.`update_time` = ? where `id` = ? // [null,"2022-07-05 10:47:36",1] // 开启软删除时的真实永久删除 $user = User::onlyTrashed()->find(3); $user->forceDelete(); // select * from `user` where `user`.`delete_time` is not null and `user`.`id` = ? limit 1 // delete from `user` where `id` = ? ``` ## 模型的作用域 - 本地作用域 - 全局作用域 1、本地作用域 ```php class User extends Model { // 本地作用域 查询条件:成年人 public function scopeAdult($query) { return $query->where('age', '>', 18); } } ``` ```php User::adult()->get(); // select * from `user` where `age` > ? ``` 支持传递参数 ```php class User extends Model { // 本地作用域 支持传递参数 public function scopeQueryWhere($query, $where) { return $query->where($where); } } ``` ```php User::queryWhere([ ['age', '>', 10] ])->get(); // select * from `user` where (`age` > ?) ``` 2、全局作用域 定义全局作用域 ```php where('status', 1); } } ``` ```php class User extends Model { // 启用全局作用域 protected static function booted() { parent::booted(); // 全局公共模块 static::addGlobalScope(new StatusScope()); // 或者 只是针对某个模块 static::addGlobalScope('status', function (Builder $builder) { return $builder->where('status', 1); }); } } ``` 使用 ```php User::queryWhere([ ['age', '>', 10] ])->get(); // select * from `user` where (`age` > 10) and `status` = 1 ``` 取消全局条件 ```php // 取消全局类的条件 User::withoutGlobalScope(StatusScope::class)->get(); // select * from `user` // 取消名称为 status 的全局 User::withoutGlobalScope('status')->get(); // select * from `user` // 取消全部全局作用域 User::withoutGlobalScopes()->get(); // 取消部分作用域 User::withoutGlobalScopes([ FirstScope::class, SecondScope::class ])->get(); ``` ## 模型的访问器和修改器 1、访问器 获取数据时,拦截属性并对属性进行修改 ```php // 前固定 get,后固定 Attribute,Name 是字段名 // 参数 $value 是源字段值,可修改返回 // 属性:name // name 曹真 -> 【曹真】 public function getNameAttribute($value) { return '【'.$value.'】'; } ``` 可以创建一个虚拟字段,用已有的数据字段进行整合,不过要进行数据追加 ```php // 将虚拟字段追加到数据对象列表里去 protected $appends = ['info'] // 虚拟字段 info public function getInfoAttribute(){ // "info": "【曹真】-23" return "{$this->name}-{$this->age}"; // 使用源字段进行创建虚拟字段 "info": "曹真-23" return $this->attributes['name'] . '-' . $this->attributes['age']; } ``` 2、修改器 在写入的时候拦截,进行修改再写入 ```php // 修改器,写入数据时,将年龄+10 public function setAgeAttribute($value) { $this->attributes['age'] = $value + 10; } ``` ```php // 设置可以自动写入日期的列 // 默认 created_at 和 updated_at protected $dates = [ 'details' ]; // 设置字段输出的类型,比如设置一个布尔型,输出时就是true和false; // 设置字段类型 protected $casts = [ 'details' => 'boolean' ]; ```