字段定义
系统在模型首次实例化的时候自动获取数据表的字段信息,如果设置了缓存,就会将字段信息永久缓存;在没有设置缓存或者调试状态下,每次实例化都会重新获取数据表的字段信息。
缓存字段信息保存在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 {
}