博客列表 >8.【TP6学习笔记】Model模型创建操作设置

8.【TP6学习笔记】Model模型创建操作设置

 一纸荒凉* Armani
 一纸荒凉* Armani原创
2021年05月29日 15:21:074300浏览

ThinkPHP6 模型

  • 请确保你已经在数据库配置文件中配置了数据库连接信息
  • 模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写
  • 模型自动对应的数据表名称都是遵循小写+下划线规范,如果你的表名有大写的情况,必须通过设置模型的table属性。

一、创建模型

模型名 数据库前缀
Cat shop_cat
Goods shop_goods
UserOrder shop_user_order

表前缀设置:config/database.php 文件里 prefix

  • 第一步:创建一个跟控制器平级的目录,目录名:model
  • 第二步:在 model创建 Goods.php 文件

二、模型操作

在模型中除了可以调用数据库类的方法之外(换句话说,数据库的所有查询构造器方法模型中都可以支持),可以定义自己的方法,所以也可以把模型看成是数据库的增强版

  • 模型文件里的自定义方法,不要和 thinkphp 方法一样名称
  • 模型里的Goods:: 也可以用 static:: 关键词
  • 链式操作,都可以在模型里使用

1、find查询数据

find 获取单条数据,返回的是当前模型的对象实例

  1. namespace app\model;
  2. use think\Model;
  3. class Goods extends Model{
  4. public function find(){
  5. $find = Goods::find(6);
  6. $find = Goods::where('id',7)->find();
  7. return $find;
  8. }
  9. }

2、controller怎么调用model

  1. namespace app\controller;
  2. use app\model\Goods;
  3. class Index{
  4. public function index(){
  5. $db = new Goods();
  6. $index = $db->find();
  7. print_r($index);
  8. }
  9. }

find(6) 查询失败,是因为数据库主键名称不是 id

3、select查询数据

select 获取多条数据,返回的是当前模型的对象实例

  1. public function select(){
  2. $select = Goods::select();
  3. $select = Goods::select(6);
  4. $select = Goods::where('id','>',7)->select();
  5. return $select;
  6. }

4、数据转换

toArray方法将当前的模型实例输出为数组

  1. public function select(){
  2. $select = Goods::select();
  3. $select = Goods::select(6);
  4. $select = Goods::where('id','>',7)->select();
  5. return $select->toArray();
  6. }

5、增加数据

  • create 静态方法添加数据,返回的是当前模型的对象实例
  1. public function create(){
  2. $create = Goods::create([
  3. 'cat' => 3,
  4. 'title' => '新商品',
  5. 'price' => '59.99',
  6. 'add_time' => time()
  7. ]);
  8. echo $create->id; // 可以直接获取自增id
  9. return $create;
  10. }

新增数据的最佳实践原则:使用create方法新增数据,使用saveAll批量新增数据。

6、修改数据

  • update静态方法修改数据,返回的是当前模型的对象实例
  • save在取出数据后,更改字段更新数据。这种方式是最佳的更新方式
  1. namespace app\model;
  2. use think\Model;
  3. class Goods extends Model{
  4. public function update(){
  5. \# 更新方式1
  6. $update = Goods::update(
  7. ['price'=>'99.99'],
  8. ['id'=>22]
  9. );
  10. return $update;
  11. \# 更新方式2
  12. $user = Goods::find(23);
  13. $user->price = '102.99';
  14. $save = $user->save();
  15. return $save;
  16. }
  17. }

7、删除数据

  • delete静态方法删除数据,返回的是当前模型的对象实例
  • destroy 根据主键删除
  1. public function delete(){
  2. \# 删除方法1
  3. $delete = Goods::where('id',3)->delete();
  4. \# 删除方法2
  5. $delete = User::destroy(4);
  6. return $delete;
  7. }

TP模型如果只能增删查改,不如在 Controller执行了。TP模型很多特点,下面为大家一一介绍

三、模型设置

为了和数据库更好的适配,模型可以提前设置对应的数据库属性,一个文件配置一个数据表

属性 描述
name 模型名(相当于不带数据表前后缀的表名,默认为当前模型类名)
table 数据表名(默认自动获取)
pk 主键名(默认为 id )
schema 模型对应数据表字段及类型
type 模型需要自动转换的字段及类型
disuse 数据表废弃字段(数组)

1、name和table

当你的数据表没有前缀的时候,name和table属性的定义是没有区别的,定义任何一个即可

  1. class Goods extends Model{
  2. protected $name = 'Goods';
  3. protected $table = 'shop_goods';
  4. public function select(){
  5. $select = Goods::select();
  6. return $select->toArray();
  7. }
  8. }

2、pk 改变主键名称

model 默认的主键是id

  1. // 可以把主键改为shop_id 试试
  2. ALTER TABLE `ouyangke`.`shop_goods`
  3. CHANGE COLUMN `id` `shop_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT ' 商品ID' FIRST,
  4. DROP PRIMARY KEY,
  5. ADD PRIMARY KEY (`shop_id`) USING BTREE;
  6. class Goods extends Model{
  7. protected $name = 'Goods';
  8. protected $table = 'shop_goods';
  9. protected $pk = 'shop_id';
  10. public function find($id=1){
  11. $find = Goods::find($id);
  12. return $find->toArray();
  13. }
  14. }

3、schema设置模型对应数据表字段及类型

  • 默认会自动获取(包括字段类型),但自动获取会导致增加一次查询
  • schema 属性一旦定义,就必须定义完整的数据表字段类型
  • 类型根据php数据类型定义,如果是json类型直接定义为json即可
  1. class Goods extends Model{
  2. protected $name = 'Goods';
  3. protected $table = 'shop_goods';
  4. protected $pk = 'shop_id';
  5. protected $schema = [
  6. 'shop_id' => 'int',
  7. 'cat' => 'int',
  8. 'title' => 'string',
  9. 'price' => 'float',
  10. 'discount' => 'int',
  11. 'stock' => 'int',
  12. 'status' => 'int',
  13. 'add_time' => 'int'
  14. ];
  15. \# 对某个字段定义需要自动转换的类型,可以使用type属性
  16. protected $type = [
  17. 'shop_id' => 'int'
  18. ];
  19. public function select(){
  20. $select = Goods::select();
  21. return $select->toArray();
  22. }
  23. }

4、disuse数据表废弃字段(数组)

  1. class Goods extends Model{
  2. protected $name = 'Goods';
  3. protected $table = 'shop_goods';
  4. protected $pk = 'shop_id';
  5. protected $disuse = [
  6. 'discount',
  7. 'stock'
  8. ];
  9. public function select(){
  10. $select = Goods::select();
  11. return $select->toArray();
  12. }
  13. }

5、其他属性(不常用)

属性 描述
suffix 数据表后缀(默认为空)
connection 数据库连接(默认读取数据库配置)
query 模型使用的查询类名称
field 模型允许写入的字段列表(数组)
strict 是否严格区分字段大小写(默认为 true )
readonly 字段只读
json 设置字段为JSON数据
jsonType 设置JSON字段的类型
jsonAssoc 设置JSON数据返回数组
autoWriteTimestamp 自动写入创建和更新的时间戳字段(默认关闭)
createTime 创建时间戳字段
updateTime 更新时间戳字段
deleteTime 用于定义你的软删除标记字段
defaultSoftDelete 定义软删除字段的默认值

四、模型 主要功能

1、获取器

  • 获取器的作用是对模型实例的(原始)数据做出自动处理
  • 命名规则:get + 字段名 + Attr
  • 字段名是数据表字段的驼峰转换
  1. class Goods extends Model{
  2. public function index(){
  3. $find = Goods::find(10);
  4. echo $find->status;
  5. return $find->toArray();
  6. }
  7. public function getStatusAttr($v){
  8. $status = [
  9. 1=>'开启',
  10. 2=>'关闭'
  11. ];
  12. return $status[$v];
  13. }
  14. }

2、修改器

  • 修改器的主要作用是对模型设置的数据对象值进行处理
  • 命名规则: set + 字段名 + Attr
  1. class Goods extends Model{
  2. public function index(){
  3. $create = Goods::create([
  4. 'cat' => 3.33,
  5. 'title' => '新商品',
  6. 'price' => '59.99',
  7. 'add_time' => time()
  8. ]);
  9. return $create;
  10. }
  11. public function setCatAttr($v,$all){
  12. // $all 全部参数
  13. return (int)$v;
  14. }
  15. }

3、搜索器

  • 搜索器的作用是用于封装字段(或者搜索标识)的查询条件表达式
  • 命名规则: search + 字段名 + Attr
  1. class Goods extends Model{
  2. public function index(){
  3. $select = Goods::withSearch(['title'],[
  4. 'title' => '新'
  5. ])->select();
  6. return $select->toArray();
  7. }
  8. public function searchTitleAttr($query,$v){
  9. $query->where('title','like', $v . '%');
  10. }
  11. }

4、检查数据

  • 如果要判断数据集是否为空,不能直接使用 empty判断
  • 必须使用数据集对象的 isEmpty方法判断
  1. class Goods extends Model{
  2. public function index(){
  3. $select = Goods::where('title','1')->select();
  4. if(empty($select)){
  5. echo 111;
  6. }
  7. if($select->isEmpty()){
  8. echo 111;
  9. }
  10. }
  11. }

五、右侧列表改为model示例

model代码

  1. namespace app\model;
  2. use think\Model;
  3. use think\facade\Db;
  4. class Goods extends Model{
  5. protected $name = 'Goods';
  6. protected $table = 'shop_goods';
  7. public function get_all($where,$order='add_time DESC',$p=1,$total=10){
  8. $count = Goods::where($where)->count();
  9. $list = Goods::where($where)
  10. ->order($order)
  11. ->page($p,$total)
  12. ->select();
  13. if($list->isEmpty()){
  14. return null;
  15. }
  16. $data = $list->toArray();
  17. foreach($data as &$data_v){
  18. $data_v['cat'] = Db::table('shop_cat')->where('id',$data_v['cat'])->value('name');
  19. }
  20. $arr = [
  21. 'count' => ceil($count/$total),
  22. 'data' => $data
  23. ];
  24. return $arr;
  25. }
  26. public function getStatusAttr($v){
  27. $status = [
  28. 1=>'开启',
  29. 2=>'关闭'
  30. ];
  31. return $status[$v];
  32. }
  33. public function getAddTimeAttr($v){
  34. return date('Y-m-d',$v);
  35. }
  36. }

controller代码

  1. public function index(){
  2. $title = '商城';
  3. $login = '欧阳克';
  4. \# 左侧菜单
  5. $menu = Db::table('shop_menu')->where('fid',0)->select();
  6. $left = [];
  7. foreach($menu as $menu_k=>$menu_v){
  8. $left[$menu_k] = $menu_v;
  9. $left[$menu_k]['lists'] = Db::table('shop_menu')->where('fid',$menu_v['id'])->select();
  10. }
  11. \# 右侧列表
  12. $param = Request::param();
  13. if(isset($param['status']) && $param['status'] == 1){
  14. $where['status'] = 1;
  15. }else if(isset($param['status']) && $param['status'] == 2){
  16. $where['status'] = 2;
  17. }else{
  18. $where = true;
  19. }
  20. $p = isset($param['p']) ? $param['p'] : 1;
  21. $db = new Goods();
  22. $order = [
  23. 'add_time DESC',
  24. 'id DESC'
  25. ];
  26. $right = $db->get_all($where,$order,$p,5);
  27. View::assign([
  28. 'title' => $title,
  29. 'login' => $login,
  30. 'left' => $left,
  31. 'right' => $right['data'],
  32. 'count' => $right['count'],
  33. 'p' => $p,
  34. 'status' => isset($param['status']) ? $param['status'] : 0
  35. ]);
  36. return View::fetch();
  37. }

html代码

  1. <td>{$right_v.status}</td>
  2. <td>{$right_v.add_time}</td>

六、模型事件

  • 模型事件是指在进行模型的查询和写入操作的时候触发的操作行为
  • 模型事件只在调用模型的方法生效,使用查询构造器操作是无效的
编号 事件 描述 事件方法名
1 after_read 查询后 onAfterRead
2 before_insert 新增前 onBeforeInsert
3 after_insert 新增后 onAfterInsert
4 before_update 更新前 onBeforeUpdate
5 after_update 更新后 onAfterUpdate
6 before_write 写入前 onBeforeWrite
7 after_write 写入后 onAfterWrite
8 before_delete 删除前 onBeforeDelete
9 after_delete 删除后 onAfterDelete
10 before_restore 恢复前 onBeforeRestore
11 after_restore 恢复后 onAfterRestore
  1. namespace app\model;
  2. use think\Model;
  3. class Goods extends Model{
  4. public function one_update(){
  5. $update = Goods::update(
  6. ['price'=>'99.99'],
  7. ['id'=>22]
  8. );
  9. return $update;
  10. }
  11. # 执行更新操作,就会之下onBeforeUpdate方法
  12. public static function onBeforeUpdate($goods){
  13. print_r($goods->price);
  14. return true;
  15. }
  16. }
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议