改进Model类的getData方法和getAttr方法 增加autoFetchFieldType属性 用于设置是否自动获取字段信息 默认为true

This commit is contained in:
thinkphp
2016-06-04 10:55:21 +08:00
parent e0005ea5ad
commit e9b60d1e4d

View File

@@ -63,6 +63,8 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
protected $insert = []; protected $insert = [];
// 更新自动完成列表 // 更新自动完成列表
protected $update = []; protected $update = [];
// 是否自动获取字段类型信息
protected $autoFetchFieldType = true;
// 是否需要自动写入时间戳 // 是否需要自动写入时间戳
protected $autoWriteTimestamp; protected $autoWriteTimestamp;
// 创建时间字段 // 创建时间字段
@@ -108,15 +110,17 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
$this->class = get_class($this); $this->class = get_class($this);
if (empty($this->name)) { if (empty($this->name)) {
// 当前模型名
$this->name = basename(str_replace('\\', '/', $this->class)); $this->name = basename(str_replace('\\', '/', $this->class));
} }
if (empty($this->fieldType)) { if ($this->autoFetchFieldType && empty($this->fieldType)) {
// 获取字段类型信息并缓存 // 获取字段类型信息
$this->fieldType = $this->db()->getTableInfo('', 'type'); $this->fieldType = $this->db()->getTableInfo('', 'type');
} }
if (is_null($this->autoWriteTimestamp)) { if (is_null($this->autoWriteTimestamp)) {
// 自动写入时间戳
$this->autoWriteTimestamp = $this->db()->getConfig('auto_timestamp'); $this->autoWriteTimestamp = $this->db()->getConfig('auto_timestamp');
} }
@@ -178,6 +182,23 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
return $this; return $this;
} }
/**
* 获取对象原始数据 如果不存在指定字段返回false
* @access public
* @param string $name 字段名 留空获取全部
* @return mixed
*/
public function getData($name = null)
{
if (is_null($name)) {
return $this->data;
} elseif (array_key_exists($name, $this->data)) {
return $this->data[$name];
} else {
return false;
}
}
/** /**
* 修改器 设置数据对象值 * 修改器 设置数据对象值
* @access public * @access public
@@ -287,17 +308,17 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
*/ */
public function getAttr($name) public function getAttr($name)
{ {
$value = isset($this->data[$name]) ? $this->data[$name] : null; $value = $this->getData($name);
// 检测属性获取器 // 检测属性获取器
$method = 'get' . Loader::parseName($name, 1) . 'Attr'; $method = 'get' . Loader::parseName($name, 1) . 'Attr';
if (method_exists($this, $method)) { if (method_exists($this, $method)) {
$value = $this->$method($value, $this->data); $value = $this->$method($value, $this->data);
} elseif (!is_null($value) && isset($this->type[$name])) { } elseif (isset($this->type[$name])) {
// 类型转换 // 类型转换
$value = $this->readTransform($value, $this->type[$name]); $value = $this->readTransform($value, $this->type[$name]);
} elseif (is_null($value) && !isset($this->fieldType[$name]) && method_exists($this, $name)) { } elseif (false === $value && method_exists($this, $name)) {
// 获取关联数据 // 不存在该字段 获取关联数据
$value = $this->relation()->getRelation($name); $value = $this->relation()->getRelation($name);
// 保存关联对象值 // 保存关联对象值
$this->data[$name] = $value; $this->data[$name] = $value;
@@ -350,17 +371,6 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
return $value; return $value;
} }
/**
* 获取对象原始数据
* @access public
* @param string $name 字段名 留空获取全部
* @return array
*/
public function getData($name = '')
{
return array_key_exists($name, $this->data) ? $this->data[$name] : $this->data;
}
/** /**
* 设置需要追加的输出属性 * 设置需要追加的输出属性
* @access public * @access public
@@ -374,7 +384,7 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
} }
/** /**
* 设置需要隐藏的属性 * 设置需要隐藏的输出属性
* @access public * @access public
* @param array $hidden 属性列表 * @param array $hidden 属性列表
* @return $this * @return $this
@@ -662,9 +672,9 @@ abstract class Model implements \JsonSerializable, \ArrayAccess
} }
/** /**
* 设置自动完成的字段 * 设置自动完成的字段 规则通过修改器定义)
* @access public * @access public
* @param array $fields 需要自动完成的字段 规则通过修改器定义) * @param array $fields 需要自动完成的字段
* @return $this * @return $this
*/ */
public function auto($fields) public function auto($fields)