模型Model

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zuimei_forver/article/details/68487669

字段定义
    系统在模型首次实例化的时候自动获取数据表的字段信息,如果设置了缓存,就会将字段信息永久缓存;在没有设置缓存或者调试状态下,每次实例化都会重新获取数据表的字段信息。
    缓存字段信息保存在Runtime/Data/_fields目录下,每个模型对应一个缓存文件,并非每个数据表对应一个缓存文件。
    命名格式:数据库名.模型名(小写).php 如:demo.user.php
    缓存内容:字段信息、主键字段、是否自动增长、字段类型信息(开启字段类型验证)
    关闭缓存:DB_FIELDS_CACHE 设置为 false
    手动定义字段:$fields 不依赖字段缓存,避免IO加载的效率开销,提高性能。

$fields = array('id', 'username', '_pk'=>'id', '_type'=>array('id'=>'bigint', 'username'=>'varchar'));

    _pk定义主键名;_type定义字段类型

    注意事项:在部署模式下修改了数据表的字段信息,可能需要清空Data/_fileds目录下的缓存文件,让系统重新获取更新的数据表字段信息,否则会发生新增字段无法写入的问题 。

连接数据库
    使用数据库时,需要配置数据库连接信息,配置文件的定义方式有数组和DSN两种。一般在应用或者慕模块的配置文件中定义,若模型有特殊需要,可在模型中定义$connection属性(实例化数据库对象时,使用$connection配置的连接信息)。
    数组方式:

array(
 'DB_TYPE'        => 'mysql',          //数据库类型
 'DB_HOST'      => 'localhost',     //服务器地址
 'DB_NAME'     => 'thinkphp',     //数据库名
 'DB_USER'       => 'root',           //用户名
 'DB_PWD'        => '123456',     //密码
 'DB_PORT'       => 3306,          //端口
 'DB_PREFIX'     => 'think_',       //数据库表前缀
 'DB_CHARSET' => 'utf8',          //字符集
)

    DB_DSN方式:

'DB_DSN'     => 'mysql://root:123456@localhost:3306/thinkphp#utf8'

    如果两种方式同时存在,DB_DSN配置优先

切换数据库
    Model->db(‘数据库编号’, ‘数据库配置’)
    在模型操作过程中可以使用db动态切换数据库,支持切换到相同和不同的数据库类型。
    数据库编号采用数字格式,对于已经调用过的数据库连接,不需要再传入配置信息。默认数据库连接的编号是0,因此不要再次定义数据库编号为0的数据库配置。

Active Record
    实现了ActiveRecords模式的ORM模型,采用了非标准的ORM模型:表映射到类,记录映射到对象。

字段映射
    字段映射功能可以在表单中隐藏真正的数据表字段,而不用担心放弃自动创建表单对象的功能。

$_map = array(
 'name' => 'username',  //把表单中name映射到数据表的username字段
 'mail'   => 'email',          //把表单中mail映射到数据表的email字段
);

    在表单中仍然使用name和mail,但在使用create()创建数据对象时,会自动转换成实际数据表字段。
    使用字段映射后,默认不会对读取的数据自动处理。也就是,从数据库读出的数据字段仍然是username和email。
    如果需要在读取数据时自动处理,设置READ_DATA_MAP为true即可。

自动验证
    自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用create创建数据对象的时候自动进行数据验证。
    数据验证可以进行数据类型、业务规则、安全判断等方面的验证操作。

    验证规则的定义格式为:

array(
 array(验证字段, 验证规则, 错误提示, [验证条件, 附加规则, 验证时间]),
 .........
);

    验证字段(必须):需要验证的表单字段名称(数据库字段或者表单的辅助字段如确认密码)。如果定义了字段映射,这里的验证字段应该是实际的数据表字段而非表单字段。
    验证规则(必须):要进行验证的规则,需要结合附加规则,如果在使用正则验证的附加规则情况下,系统还内置了一些常用的正则验证规则,包括:require字段必须、email邮箱、url URL地址、currency 货币、number 数字。
    提示信息(必须):用于验证失败后的提示信息
    验证条件(可选): 0 存在就验证(默认);1 必须验证; 2 值不为空时验证
    附加规则(可选):
这里写图片描述
    验证时间(可选):1 新增数据; 2 编辑数据; 3 全部情况(默认)

    数据验证有两种方式:
        静态方式:在模型类中通过$_validate属性定义验证规则。

     $_validate = array(
     array('verify', 'require', '验证码必须!'),
      ..... 
 )    

 //在使用create()方法创建数据对象时自动调用:
 $user = D("User");
 if (!$user->create()) {
        //创建失败,表示验证没有通过,输出错误提示信息
       exit($user->getError()); 
 } else {
      //验证通过
 }

         动态方式:使用模型类的validate方法动态创建自动验证规则。

 $rules = array(
     array(),
      ..... 
 );

 $user = M("User");
 if ($user->validate($rules)->create()) {
     //验证通过 
 }     else {
     //验证失败 
 }

    create()方法的第二个参数用于指定自动验证规则中的验证时间,即create()方法的自动验证只会验证符合验证时间的验证规则。验证时间并非只有1,2,3三种,用户可以自己定义验证时间。如给登陆操作指定验证时间4。

 $_validate = array(
 array('name', 'checkName', '账号错误', 1, 'function', 4) ,//在登陆时验证
 );

 $user = D("User");
 if ($user->create($_POST, 4)) {
      //验证通过
 } else {
     //验证失败 
 }

    注意:静态定义方式因为必须定义模型类,所以只能用D函数实例化模型; 动态验证不依赖模型类的定义,通常用M函数实例化模型。

自动完成
    完成数据自动处理和过滤,使用create方法创建数据对象时自动完成数据处理。
    规则定义:

          array(
          array(完成字段, 完成规则, [完成条件, 附加规则]) ,
           ......
      )

    完成字段(必须):需要进行处理的数据表实际字段名称
    完成规则(必须):需要处理的规则,配合附加规则完成
     完成时间(可选):设置自动完成的时间
    附加规则(可选):
这里写图片描述
    静态定义:
    预先在模型里定义好的自动完成规则。

  protected $_auto = array(
      array('status', '1') , //新增的时候把status字段设置为1
      array('password', 'md5', 3, 'function'), //对password字段在新增和编辑时使用md5函数处理
  )
  $user = D('User');
  $user->create()->add();

    动态定义:

  $rules = array(               
       array('status', '1') , //新增的时候把status字段设置为1
      array('password', 'md5', 3, 'function'), //对password字段在新增和编辑时使用md5函数处理
  );

  $user = M('User');
  $user->auto($rules)->create()->add();

虚拟模型
    不是真正操作数据库的模型,仅仅借助模型类来封装一些业务逻辑;虚拟模型不会自动连接数据库,因此不会自动检测数据表和字段信息。有两种方法定义:
     继承Model类

 namespace Home\Model;
 class UserModel extends \Think\Model {
     protected $autoCheckFields = false; //设置为false后,关闭字段信息的自动检测。
 }

    不继承Model类

 namespace Home\Model;
 class UserModel {
 }

猜你喜欢

转载自blog.csdn.net/zuimei_forver/article/details/68487669