多主键时TP model中save方法的问题,探讨ThinkPHP 的orm的潜规则

2015-05-30 09:34:00
hainuo
原创 4078
摘要:在ThinkPHP使用save操作直接保存信息,但是因为主键设置了两个,导致ThinkPHP获取主键不正确
在ThinkPHP中有快捷方法```M('s')->save($data);```要求`$data`中包含主键即可,由于我们设计数据表默认都包含`id`字段,且为主键,所以我再使用的时候就在`$data`中增加了id的值。但是问题来了我调试多次之后发现仍然是不行的。最后将所有数据都使用了,只修改其中一个使用M('s')->getLastSql();能够抓取到信息了。我也就傻眼了 ```update s set y=5,t=6,id=1231  where  name='xxxx'```于是去表中查看,竟然有两个主键。这种情况的原因就在于ThinkPHP中的getPk()方法让我们看一下源代码```/** * 获取字段信息并缓存 * @access public * @return void */public function flush() {    // 缓存不存在则查询数据表信息    $this->db->setModel($this->name);    $fields =   $this->db->getFields($this->getTableName());    if(!$fields) { // 无法获取字段信息        return false;    }    $this->fields   =   array_keys($fields);    $this->fields['_autoinc'] = false;    foreach ($fields as $key=>$val){        // 记录字段类型        $type[$key]    =   $val['type'];        if($val['primary']) {            $this->fields['_pk'] = $key;  //*******************就在这一样            if($val['autoinc']) $this->fields['_autoinc']   =   true;        }    }    // 记录字段类型信息    $this->fields['_type'] =  $type;    if(C('DB_FIELD_VERSION')) $this->fields['_version'] =   C('DB_FIELD_VERSION');    // 2008-3-7 增加缓存开关控制    if(C('DB_FIELDS_CACHE')){        // 永久缓存数据表信息        $db   =  $this->dbName?$this->dbName:C('DB_NAME');        F('_fields/'.strtolower($db.'.'.$this->name),$this->fields);    }}/** * 获取主键名称 * @access public * @return string */public function getPk() {    return isset($this->fields['_pk'])?$this->fields['_pk']:$this->pk;}```有上面的代码可以轻松看到,ThinkPHP的orm只能够适用于1个主键的情况。所以问题产生原因在ThinkPHP,当然也在于我们没有遵循潜规则。
发表评论
拾 加 陆 =
评论通过审核后显示。