TP笔记4、模型

本文详细介绍了ThinkPHP框架中的模型使用,包括模型创建规则、实例化对象(M函数与D函数的区别)、CRUD操作、数据表字段定义、字段映射、自动验证和自动完成。并提供了相关代码示例,帮助读者深入理解模型在实际开发中的应用。
摘要由CSDN通过智能技术生成

1 模型

1.1 模型创建规则

  1. 存储地址:/应用/模块/Model目录中
  2. 命名规则:模型名称+Model+.class.php
  • 模型名称应与对应表名一致

1.2 实例化模型对象

1.2.1 常用实例化
  • dump()是TP一个内置函数。与PHP的var_dump()差不多
public function test1(){
        $model=new \Admin\Model\GoodsModel();.//要使用命名空间
        dump($model);
    }

在这里插入图片描述

1.2.2 TP内置M函数实例化对象
  • M函数默认3个参数。第一个指某个数据表,第二个指表前缀,第三个指mysql连接信息
public function test2(){
        $model=M('goods');//参数指定具体数据表
        dump($model);
    }

在这里插入图片描述

1.2.3 D函数实例化
  • D函数可以跨模块使用
  • 当实例化某个不存在的自定义模型,会使用TP的模型基类进行实例化
public function test3(){
        $model=D('goods');
        dump($model);
    }
1.2.4 M与D的区别
  1. M用于实例化TP的模型基类
  2. D会优先实例化自定义的模型。若自定义模型类不存在,就实例化TP模型基类

1.3 模型的CURD(增删改查)操作

  1. 增(add、addAll)
  2. 删(delete)
  3. 改(save)
  4. 查(find、select)
1.3.1 数据写入(add、addAll)
  1. add方法(写入单条数据
public function test4(){
        //实例化模型对象
        $model=D('goods');
        //拼接具体要写入的数据
        //add()实现写入单条数据,所以写入一维数组格式
        $data=array(
            'goods_name'=>'test4',
            'goods_time'=>time(),
            'goods_body'=>'test4body'
        );
        $res=$model->add($data);
        dump($res);
    }

在这里插入图片描述

  1. addAll方法(写入多条数据
public function test5(){
        //实例化模型对象
        $model=D('goods');
        //拼接具体要写入的数据
        //addAll()实现写入多条数据,所以写入二维数组格式
        $data=array(
            array('goods_name'=>'test4', 'goods_time'=>time(), 'goods_body'=>'test4body'),
            array('goods_name'=>'test5', 'goods_time'=>time(), 'goods_body'=>'test5body'),
            array('goods_name'=>'test6', 'goods_time'=>time(), 'goods_body'=>'test6body'),
        );
        $res=$model->addAll($data);
        dump($res);
    }

在这里插入图片描述

1.3.2 数据修改
  1. save指定修改条件
  • save会识别主键标识,如下的代码goods_id为主键
public function test6(){
        $model=D('goods');
        $data=array(
            'goods_id'=>3,//指定修改id为3的数据
            'goods_name'=>'testSave'
        );
        $res=$model->save($data);
        dump($res);
    }
  • dump若返回int(1),标识受影响一行
  • 若返回0,表示没有数据进行更新操作
  1. where指定修改条件
public function test7(){
        $model=D('goods');
        $data=array(
            'goods_name'=>'testSave'
        );
        $res=$model->where("goods_name='test5'")->save($data);
        dump($res);
    }
  • where方法可以使用数组格式指定条件
  • == 也可以使用原生SQL语句中的where子句==
  1. setField更新个别字段
public function test8(){
        $model=D('goods');
        //修改多个字段
        $model->where('goods_id=6')->setField(
          array(
              'goods_name'=>'testSetField',
              'goods_body'=>'testSetFieldBody'
          )
        );
        //修改单个字段
        $model->where('goods_id=7')->setField('goods_name','testSetField');
    }
  1. setIncsetDec
    setInc:指定某个字段的值进行增加操作
    setDec:指定某个字段的值进行减少操作
public function test9(){
        $model=D('goods');
        //实现增加操作,默认为加1
        $model->where('goods_id=9')->setInc('addtime');
        //实现减少操作,第二个参数指定减少的值
        $model->where('goods_id=10')->setDec('addtime',100);
    }
1.3.3 数据查询
  1. find:获取一条数据,返回数据格式是一维数组
  2. select:获取多条数据,返回数据格式是二维数组
public function test10(){
        $model=D('goods');
        //获取一条数据
        $data=$model->where('goods_id=1')->find();
        dump($data);
        //获取多条数据
        $data=$model->where("goods_name='testSave'")->select();
        dump($data);
    }

在这里插入图片描述

1.3.4 数据删除
public function test11(){
        $model=D('goods');
        //直接调用delete方法删除非常危险,必须加入where条件
        $res=$model->where('goods_id=2')->delete();
        //获取最后执行的SQL语句
        echo $model->getLastSql();
        dump($res);
    }

在这里插入图片描述

1.5 数据表字段定义

  • 在自定义的模型中将具体的字段信息保存到某个属性中(固定的属性名称)。本质就是将具体的字段信息保存到变量中。变量会载入到内存。由于内存的速度比磁盘更快。所以字段定义字段缓存效果更高
1.5.1 修改Goods模型
在GoodsModel.class.php中写入:
class GoodsModel extends Model{
    //通过属性指定主键字段信息
    protected $pk='goods_id';
    //实现字段定义功能
    //将每个字段写入到对应数组中,每个字段就是一个元素
    //必须写全字段
    protected $fields=array('goods_name','goods_name','goods_img','addtime','goods_body');

}

在这里插入图片描述

1.6 数据创建

  • create方法默认只能处理post方式
  • 在GoodsModel.class.php中写入:
public function add(){
        if(IS_GET){
            $this->display;
        }else{
            //post表单提交
            $model=D('Goods');
            $data=$model->create();
            dump($data);
        }
    }

1.7 字段映射

  • 隐藏真实字段名,用别名代替
在GoodsModel.class.php中写入:
//字段的映射功能,对应的是数组格式
    protected $_map=array(
        'name'=>'goods_name',
        'pic'=>'goods_img',
        'body'=>'goods_body'
    );

1.8 自动验证

1.8.1 验证规则
  1. 静态方式:在模型类通过$_validate属性定义规则
  2. 动态方式:使用模型类的validate方法动态创建自动验证规则
  • 格式:
arrayarray(验证字段1,验证规则,错误提示,[ 验证条件,附加规则,验证时间 ]),
	array(验证字段2,验证规则,错误提示,[ 验证条件,附加规则,验证时间 ]),
	....
  • 验证规则一般跟附加规则配合使用
验证条件说明
self::EXISTS_VALIDATE或0存在字段就验证(默认)
self::MUST_VALIDATE或1必须验证
self::VALUE_VALIDATE或2值不为空时验证
常用附加规则说明
regex正则验证,定义的验证规则是一个正则表达式
function函数验证,定义的验证规则是一个函数名
callback方法验证,定义的验证规则是当前模型类的一个方法
验证时间说明
self::MODEL_INSERT或1新增数据时验证
self::MODEL_UPDATE或2编辑数据时验证
self::MODEL_BOTH或3全部情况下验证(默认)
1.8.2 举例
在GoodsModel.class.php中写入:
protected $_validate=array(
        array('goods_name','checkName','goods_name error',1,'callback'),
        array('goods_price','checkPrice','goods_price error',1,'function'),
        array('goods_body','require','goods_body error',1,'regex'),
        //若goods_body字符为空,就返回错误,错误提示'goods_body error'
    );
    public function checkName($goods_name){
        if(mb_strlen($goods_name,'utf8')>3){
        	//若goods_name字符大于3,就返回错误,错误提示'goods_name error'
            return false;
        }
        return true;
    }
在Application\Common\Common\function.php中写入:
function checkPrice($goods_price){
    if($goods_price<=0){
    	//若goods_price字符小于等于0,就返回错误,错误提示'goods_price error'
        return false;
    }
    return true;
}

1.9 自动完成

  • 使用create创建数据TP会自动对接收的内容进行增加或修改的操作
  1. 静态方法:在模型类通过$_auto属性定义处理规则
  2. 动态方法:使用 模型类的auto方法创建自动处理规则
  • 格式:
arrayarray(完成字段1,完成规则,[ 完成条件,附加规则 ]),
	array(完成字段2,完成规则,[ 完成条件,附加规则 ]),
	....
在GoodsModel.class.php中写入:

    public function add(){
        if(IS_GET){
            $this->display();
        }else{
            //post表单提交
            $model=D('Goods');
            //定义自动完成规则
            $auto=array(
                array('addtime','time',1,'function')
            );
            $data=$model->auto($auto)->create();
            //$this->display();
            if(!$data){
                //说明目前有数据格式不满足要求
                //获取错误信息
                dump($model->getError());
            }
            dump($data);
        }
    }

在这里插入图片描述

1.10 统计查询方法

1.10.1 查看统计查询中的方法
方法说明(参数是要统计的字段名)
Count统计数量
Max获取最大值
Min获取最小值
Avg获取平均值
Sum获取总分
public function test12(){
        //header('content-type:text/html;charset=utf8');
        $model=D('Goods');
        //计算当前数据的总行数
        echo $model->count();
        echo '<hr/>';
        //计算id中的最大值
        echo $model->max('goods_id');
        echo '<hr/>';
        //计算id的和
        echo $model->sum('goods_id');
        echo '<hr/>';
        //使用where指定条件进行查询
        echo $model->where("goods_name='testSave'   ")->sum('goods_id');
        echo '<hr/>';
    }

开启开发者工具

在Common\Conf\config.php中添加配置信息

SHOW_PAGE_TRACE’=>true,即可开启
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值