ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# ThinkPHP6 模型 --- ## 一、创建模型 * 请确保你已经在数据库配置文件中配置了数据库连接信息 * 模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写 * 模型自动对应的数据表名称都是遵循小写+下划线规范,如果你的表名有大写的情况,必须通过设置模型的table属性。 **模型名**|**对应数据表**|**数据库前缀** ---|---|--- Admin|admin|tp_admin User|user|tp_user UserOrder|user_order|tp_user_order > 表前缀设置:`config/database.php` 文件里 `prefix` ### 1、单项目模型创建 * 第一步:创建一个跟控制器平级的目录,目录名:`model` * 第二步:在 `model` 创建 `Admins.php` 文件 ### 2、多项目模型创建 * 第一步:在 `index` 项目中创建目录,目录名:`model` * 第二步:在 `model` 创建 `Admins.php` 文件 --- ## 二、模型操作 > 在模型中除了可以调用数据库类的方法之外(换句话说,数据库的所有查询构造器方法模型中都可以支持),可以定义自己的方法,所以也可以把模型看成是数据库的增强版。 * 模型文件里的自定义方法,不要和 `thinkphp` 方法一样名称 * 模型里的 `Admins::` 也可以用 `static::` 关键词 * 链式操作,都可以在模型里使用 ```php controller公用示例: namespace app\index\controller; use app\BaseController; use app\index\model\Admins; class Index extends BaseController{ public function index(){ $db = new Admins(); $index = $db->index(); print_r($index); } } ``` ### 1、模型 查询数据 * `find` 获取单条数据,返回的是当前模型的对象实例 ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ public function index(){ $find = Admins::find(1); $find = Admins::where('id',2)->find(); return $find; } } ``` * `select` 获取多条数据,返回的是当前模型的对象实例 ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ public function index(){ $select = Admins::select(); $select = Admins::select([1]); $select = Admins::where('id','>',1)->select(); return $select; } } ``` * `value` 获取单个字段数据 ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ public function index(){ $select = Admins::where('id','>',1)->value('username'); return $select; } } ``` * `column` 获取一列字段数据 ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ public function index(){ $select = Admins::column('username'); $select = Admins::column('username','id'); return $select; } } ``` ### 2、模型 增加数据 * `create` 静态方法添加数据,返回的是当前模型的对象实例 ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ public function index(){ $create = Admins::create([ 'username' => 'huazheng', 'password' => md5(123456), 'truename' => '华筝' ]); echo $create->id; // 可以直接获取自增id return $create; } } ``` > 新增数据的最佳实践原则:使用create方法新增数据,使用saveAll批量新增数据。 ### 3、模型 修改数据 * `update` 静态方法修改数据,返回的是当前模型的对象实例 ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ public function index(){ $update = Admins::update(['username'=>'欧阳克'],['id'=>1]); return $update; } } ``` ### 4、模型 删除数据 * `delete` 静态方法删除数据,返回的是当前模型的对象实例 ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ public function index(){ $delete = Admins::where('id',3)->delete(); return $delete; } } ``` --- ## 三、模型特点 * TP模型如果只能增删查改,不如在 `Controller` 执行了。TP模型很多特点,下面为大家一一介绍 ### 1、模型设置 * 为了和数据库更好的适配,模型可以提前设置对应的数据库属性 **属性**|**描述** ---|--- name|模型名(相当于不带数据表前后缀的表名,默认为当前模型类名) table|数据表名(默认自动获取) pk|主键名(默认为 `id` ) schema|模型对应数据表字段及类型 disuse|数据表废弃字段(数组) | | suffix|数据表后缀(默认为空) connection|数据库连接(默认读取数据库配置) type|模型需要自动转换的字段及类型 query|模型使用的查询类名称 field|模型允许写入的字段列表(数组) strict|是否严格区分字段大小写(默认为 `true` ) ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ protected $name = 'User'; protected $table = 'user'; protected $pk = 'uid'; public function index(){ $select = User::select(); return $select; } } ``` ```php controller示例: namespace app\index\controller; use app\BaseController; use app\index\model\Admins; class Index extends BaseController{ public function index(){ $db = new Admins(); $index = $db->index(); print_r($index); } } ``` * `Controller` 返回结果是数组, `Model` 返回模型的数据集。 * 两种返回值,使用方式没有区别 ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ protected $name = 'User'; protected $table = 'user'; protected $pk = 'uid'; public function index(){ $select = User::select(); return $select; } } ``` ```php controller示例: namespace app\index\controller; use app\BaseController; use app\index\model\Admins; use think\facade\Db; class Index extends BaseController{ public function index(){ $db = new Admins(); $index = $db->index(); print_r($index); $select = Db::table('user')->select(); print_r($select); } } ``` * `schema` 设置模型对应数据表字段及类型。默认会自动获取(包括字段类型),但自动获取会导致增加一次查询。 > 类型根据php数据类型定义,如果是json类型直接定义为json即可 ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ protected $name = 'User'; protected $table = 'user'; protected $pk = 'uid'; protected $schema = [ 'uid' => 'int', 'u_name' => 'string' ]; public function index(){ $select = User::select(); return $select; } } ``` ```php controller示例: namespace app\index\controller; use app\BaseController; use app\index\model\Admins; class Index extends BaseController{ public function index(){ $db = new Admins(); $index = $db->index(); print_r($index); } } ``` * `disuse` 数据表废弃字段(数组)。去掉表中不需要的字段 ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ protected $name = 'User'; protected $table = 'user'; protected $pk = 'uid'; protected $disuse = [ 'phone', 'sex','age','status' ]; public function index(){ $select = User::select(); return $select; } } ``` ```php controller示例: namespace app\index\controller; use app\BaseController; use app\index\model\Admins; class Index extends BaseController{ public function index(){ $db = new Admins(); $index = $db->index(); print_r($index); } } ``` ### 2、模型 实例化 > 模型可以使用静态访问,也可以使用 `new` 实例化 * `save` 添加或修改数据,返回成功或失败 * 要实例化 `user`,必须有 `user` 这个模型文件 ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ public function add(){ $user = new User; $save = $user->save([ 'phone' => '13522222222', 'u_name' => '梅超风', 'sex' => 1, 'age' => 67 ]); return $save; // 返回成功1,失败0 return $user->uid; // 返回自增ID } public function adds(){ $user = new User; $user->phone = '13533333333'; $user->u_name = '曲灵风'; $user->sex = 1; $user->age = 35; $save = $user->save(); return $save; // 返回成功1,失败0 return $user->uid; // 返回自增ID } public function edit(){ $user = new User; $list = [ 'phone'=>'13544444444', 'u_name'=>'陈玄风', 'sex'=>2, 'age'=>32 ]; $save = $user->where(['uid'=>37])->save($list); return $save; } } ``` ```php controller示例: namespace app\index\controller; use app\BaseController; use app\index\model\Admins; class Index extends BaseController{ public function index(){ $db = new Admins(); $add = $db->add(); echo $add; $adds = $db->adds(); echo $adds; $edit = $db->edit(); echo $edit; } } ``` * `saveAll` 批量添加或修改数据 > 批量更新仅能根据主键值进行更新,如果主键不是 ID 就不能用 ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ public function add(){ $user = new Admins; $list = [ ['username'=>'ouyangke','password'=>md5(123456),'truename'=>'欧阳克'], ['username'=>'huangrong','password'=>md5(123456),'truename'=>'黄蓉'] ]; $saveAll = $user->saveAll($list); return $saveAll; } public function edit(){ $user = new Admins; $list = [ ['username'=>'陈玄风','id'=>3], ['username'=>'梅超风','id'=>4] ]; $saveAll = $user->saveAll($list); return $saveAll; } } ``` ```php controller示例: namespace app\index\controller; use app\BaseController; use app\index\model\Admins; class Index extends BaseController{ public function index(){ $db = new Admins(); $add = $db->add(); print_r($add); $edit = $db->edit(); print_r($edit); } } ``` ### 3、模型 获取器 * 获取器的作用是对模型实例的(原始)数据做出自动处理 * 命名规则: `get` + 字段名 + `Attr` * 字段名是数据表字段的驼峰转换 ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ public function index(){ $user = Admins::find(1); echo $user->status; return $user; } public function getStatusAttr($v){ $status = [0=>'禁用',1=>'开启']; return $status[$v]; } } ``` ```php controller示例: namespace app\index\controller; use app\BaseController; use app\index\model\Admins; class Index extends BaseController{ public function index(){ $db = new Admins(); $index = $db->index(); print_r($index); print_r($index->status); } } ``` ### 4、模型 修改器 * 修改器的主要作用是对模型设置的数据对象值进行处理 * 命名规则: `set` + 字段名 + `Attr` ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ public function index(){ $admins = Admins::create([ 'username' => 'YangKang', 'password' => md5('123456'), 'truename' => '杨康' ]); return $admins; } public function setUsernameAttr($v){ return strtolower($v); // 账户只能小写 } } ``` ```php controller示例: namespace app\index\controller; use app\BaseController; use app\index\model\Admins; class Index extends BaseController{ public function index(){ $db = new Admins(); $index = $db->index(); print_r($index); } } ``` ### 5、模型 搜索器 * 搜索器的作用是用于封装字段(或者搜索标识)的查询条件表达式 * 命名规则: `search` + 字段名 + `Attr` ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ public function index(){ $admins = Admins::withSearch(['username',[ 'username' => 'admi' ])->select(); return $admins; } public function searchUsernameAttr($query,$v){ $query->where('username','like', $v . '%'); } } ``` ```php controller示例: namespace app\index\controller; use app\BaseController; use app\index\model\Admins; class Index extends BaseController{ public function index(){ $db = new Admins(); $index = $db->index(); print_r($index); } } ``` ### 6、模型 检查数据 * 如果要判断数据集是否为空,不能直接使用 `empty` 判断 * 必须使用数据集对象的 `isEmpty` 方法判断 ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ public function index(){ $admins = Admins::where('username','1')->select(); if(empty($admins)){ echo 111; } if($admins->isEmpty()){ echo 111; } } } ``` ```php controller示例: namespace app\index\controller; use app\BaseController; use app\index\model\Admins; class Index extends BaseController{ public function index(){ $db = new Admins(); $index = $db->index(); } } ``` ### 7、模型 只读字段 ```php model示例: namespace app\index\model; use think\Model; class Admins extends Model{ protected $readonly = ['username']; public function index(){ $admins = Admins::update(['username' => '穆念慈'], ['id' => 6]); return $admins; } } ``` ```php controller示例: namespace app\index\controller; use app\BaseController; use app\index\model\Admins; class Index extends BaseController{ public function index(){ $db = new Admins(); $index = $db->index(); print_r($index); } } ``` ### 8、模型 软删除 * 软删除功能,需要引入 `SoftDelete` * 需要创建一个 `delete_time` 字段 * 软删除的删除操作仅对模型的删除方法有效 ```php model示例: namespace app\index\model; use think\Model; use think\model\concern\SoftDelete; class Admins extends Model{ use SoftDelete; protected $deleteTime = 'delete_time'; //软删除标记字段 protected $defaultSoftDelete = 0; // 软删除字段的默认值 public function index(){ $admins = Admins::destroy(6); return $admins; } } ``` ```php controller示例: namespace app\index\controller; use app\BaseController; use app\index\model\Admins; class Index extends BaseController{ public function index(){ $db = new Admins(); $index = $db->index(); print_r($index); } } ```