ActiveRecord是Rails进行数据库操作的核心组件。它采用标准的ORM模型,将表映射到类,将行记录映射到实例对象,将字段映射到对象的属性。
对象关系映射
M方法快捷实例化模型后 对象直接调用字段并赋值,可直接调用add方法进行新增,直接调用find方法参数为主键值即可获得当条数据,直接调用select方法参数为众多主键值即可获取每条符合主键值的条目数据,直接调用find方法参数为主键值并直接调用其字段更改字段值并直接调用save方法即可完成一条数据的更新,直接调用delete方法参数为主键值即可删除当条数据记录。
!!!!!!!!!明日任务 将goods的增删改查用动态记录orm完成一遍!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
验证
create方法创建的数据对象是保存在内存中,并没有实际写入到数据库中,直到使用add或save方法才会真正写入数据库。create方法如果没有传值,默认取$_POST数据,如果用户提交标量内容,含有可执行htldata方法也是创建数据对象的方法 ,也会支持传入数组和对象,使用data方法创建的数据对象不会进行自动验证和过滤操作。同样也会自动过滤非法的数据类型和不存在的字符串。
create()函数工作流程:获取数据源,验证数据源的合法性,检查字段映射,判断提交状态新增或者是编辑,数据自动验证,表单令牌验证,表单数据赋值,数据自动生成,生成数据对象;
调用自定义模型 在自定义模型中定义 protected $_validate = array();数组就是验证条件
array()里的array(‘验证的字段名’,‘验证规则’,‘提示’,条件 0为字段存在时验证,1为必须验证,2为数据存在时验证!!!!!!!这里还需要在研究!!只能留到明日了!!!!!!!!!,‘附加条件’,数据执行状态1为增加2为更新 3为全部 一般3默认)是具体的条件,具体的 有字段唯一性 长度 范围 不为空 密码格式验证 判断相同验证 回调函数验证
自动完成
同样在自定义模型端创建 保护 变量 $_auto = array();
同样 array里面 还有具体的 array('填充字段',‘填充规则’,填充时间1为增加2为更新3为全部,‘附加规则 function callback field string默认’)
而这两项都会在create方法执行中的数据验证进行验证!
另外 除了在自定义数据模型端进行 保护变量赋值 还可以在活动段创建数据规则 并调用模型对象的 setProperty方法 给_validate _auto 分别赋上之前创建的数据规则 最后执行create方法即可!
M方法和D方法区别
orm
create填充源码
自动验证
自动填充
自动映射(_map源码)
M方法和D方法的区别
ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法 用于高效实例化一个基础模型类,而 D方法 用于实例化一个用户定义模型类。
使用M方法
如果是如下情况,请考虑使用 M方法:
对数据表进行简单的 CURD 操作而无复杂的业务逻辑时
只有个别的表有较为复杂的业务逻辑时,将 M方法 与实例化 CommonModel 类进行结合使用
M方法 甚至可以简单看着就是对参数表名对应的数据表的操作:
$User = M('User');
使用D方法
如果是如下情况,请考虑使用 D方法:
需要使用 ThinkPHP 模型中一些高级功能如自动验证功能(create()方法中实现)、关联模型等
业务逻辑比较复杂,且涉及的表众多
将业务逻辑定义在了自定义的模型类里面(Lib/Model目录下),而想在操作中实现这些业务逻辑
另外 D方法 不支持跨项目调用,需要使用:
$User = D('User', 'Admin'); // 实例化 Admin 项目下面的 User 模型 $User = D('Admin.User'); // 启用了项目分组
提示
启用了项目分组后,Model 类并不必然对应着项目分组。多个项目组之间共有的模型类,统一放在 Model 目录下,可以直接使用D('ModelName') 实例化。而 D('User.UserInfo') 并不表示 User 一定是一个项目分组,也可以仅仅是对 Model 下文件的一个分类目录,D('User.UserInfo') 实例化的是 User 目录下的 UserInfo 模型类。
总结
M方法 和 D方法 都可以在模型类文件不存在的情况下直接使用的,但显然 M方法 更高效;但要使用模型类里面业务逻辑,就必须使用 D方法。
一个比较形象的比喻就是:M方法 就如一台刚装好操作系统的电脑,只能使用一些基本功能;而 D方法 就如在装好的系统上再安装了一些如 Office、QQ 等应用软件,功能更加强大,同时整个电脑运行速度也变慢了。
以上是对 M方法和D方法区别的一些总结,M方法 和 D方法 要根据实际情况来具体选择。
D()和M()方法的区别:
D和M的区别主要在于
M方法不需要创建模型类文件,M方法不会读取模型类,所以默认情况下自动验证是无效的,但是可以通过动态赋值的方式实现
而D方法必须有创建模型类。
我们可以用下面两种方法去创建一个数据表的映射对象
第一种:$Test = D(‘Test’)
第二种:$Test = new Model(‘Test’)
虽然这两种都可以对数据进行select,insert,delete,udpate操作,在
数据验证上有很大的不同,
用第一种方式实例一个模型就会有数据检查功能,如果 title 没有填写的话就会提示 “请输入标题” (这个是tp提供的一个自动验证功能,当然也需要在相应的model中定义好验证条件);
如果用第二种就没有了这个数据验证功能,需要手动验证。
总结如下:
D函数实例化的是你当前项目的Lib/Model下面的模块。 如果该模块不存在的话,直接返回实例化Model的对象(意义就与M()函数相同)。 而M只返回,实例化Model的对象。它的$name参数作为数据库的表名来处理对数据库的操作。 通俗点说: D就是实例化一个基于Model文件的Model。 M则是通过直接实例化Model方法(ThinkPHP基类)来动态的实例化一个Model对象,即使这个对应的Model文件不存在。
再通俗一点说: M实例化参数是数据库的表名。 D实例化的是你自己在Model文件夹下面建立的模型文件。 D就是在你没有定义模型的时候,系统自动帮你定义一个模型,这样你才进行简单的数据输入或者输出。 每一个Action文件都应该对应Model文件的,如果你定义了Model的话, 如:$Form = D(“User”)就可以改成$Form = new UserModel();(User是指你的模型文件名)。