thinkphp模型操作重点

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支持的语法,包括使用函数和字段名称。查询表达式不仅可用于查询条件,也可以用于数据更新,例如:

  1. $User = M("User"); // 实例化User对象
  2.  // 要修改的数据对象属性赋值
  3. $data['name'] = 'ThinkPHP';
  4. $data['score'] = array('exp','score+1');// 用户的积分加1
  5. $User->where('id=5')->save($data); // 根据条件保存修改的数据
posted @ 2013-07-10 23:35  小 / 妖  阅读(576)  评论(0编辑  收藏  举报