thinkphp mongo模型的getField()方法的bug

在使用mongo模型的getField()方法获取单个字段的值时,发现无论获取什么字段,始终都只会返回对应_id字段的值,于是跟踪查看mong模型中的getField方法的代码,如下:

if(1==$options['limit']) return reset($result[0]);

此为当获取单个字段,且只获取单条记录时的代码。如果是mysql的话,改代码是没有问题的,但是mongo和mysql查询返回结果有一点区别,无论是查询什么字段,mongo都会默认将_id返回,也就是说,使用reset()后,指针指向的并不是所需的字段,而是_id,因而始终会返回_id的值。

修改起来也很简单,reset($result[0])改为$result[0][$field]就可以了。

当然,如果集合中有多层结构,如需查询info.name,就需要增加判断,具体实现如下:

$value = $result[0];

if(strpos($field, '.')){
  $tmp = explode('.', $field);
  foreach ($tmp as $t){
    $value = $value[$t];
  }
}else{
  $value = $value[$field];
}

return $value;

posted on 2015-01-09 13:53  lchecho  阅读(253)  评论(0编辑  收藏  举报

导航