create()
令牌验证、自动验证和自动完成(我们会在后面看到相关的用法)功能,其实都必须通过create方法才能生效。Create方法创建的数据对象是保存在内存中,并没有实际写入到数据库中,直到使用add或者save方法才会真正写入数据库。因此在没有调用add或者save方法之前,我们都可以改变create方法创建的数据对象。
data()
Data方法也支持传入数组和对象,使用data方法创建的数据对象不会进行自动验证和过滤操作,请自行处理。但在进行add或者save操作的时候,数据表中不存在的字段以及非法的数据类型(例如对象、数组等非标量数据)是会自动过滤的,不用担心非数据表字段的写入导致SQL错误的问题。
非法html代码可以使用htmlspecialchars进行编码,以防止用户提交的html代码在展示时被执行,以下是两种安全处理方法。
$_POST['title'] = htmlspecialchars($_POST['title']);M('User')->create();$data['title'] = $this->_post('title', 'htmlspecialchars');M('User')->create($data);
字段映射
在create()时,默认可以直接对$_POST参数进行匹配,但若参数和数据库字段不同时,可以在model中将字段进行映射,使得在create时可以自动匹配字段。
Class UserModel extends Model{ protected $_map = array( 'name' =>'username', // 把表单中name映射到数据表的username字段 'mail' =>'email', // 把表单中的mail映射到数据表的email字段 ); }
相反,若查询后需要将表字段还原到表单所对应的参数,那么需要另外加上一个条件
$data = $User->parseFieldsMap($data);
替换字段还可以直接操作filed字段,下面2条查询语句效果是一样的:
$Model->field('id,nickname as name')->select();$Model->field(array('id','nickname'=>'name'))->select();
filed用于输入查询的字段,那么当第二个参数为true时,则是排除参数,例如:
$Model->field('status',true)->select();//查询除了status外所有的字段
模型的data方法除了创建数据对象之外,还可以读取当前的数据对象,例如:
$this->find(3);$data = $this->data();//直接获取查询结果
order方法支持多条件排序:
order('status desc,id asc')
join最好不要加array参数,因为array参数情况下只可以只可以使用一次join查询,但是以下方式支持多次查询:
$Model->join(' work ON artist.id = work.artist_id')->join('card ON artist.card_id = card.id')->select();
exp查询的条件不会被当成字符串,所以后面的查询条件可以使用任何SQL支持的语法,包括使用函数和字段名称。查询表达式不仅可用于查询条件,也可以用于数据更新,例如:
- $User = M("User"); // 实例化User对象
- // 要修改的数据对象属性赋值
- $data['name'] = 'ThinkPHP';
- $data['score'] = array('exp','score+1');// 用户的积分加1
- $User->where('id=5')->save($data); // 根据条件保存修改的数据