修正Model类的_write_data方法数据检测获取不到fields的问题

This commit is contained in:
thinkphp
2016-01-19 18:54:16 +08:00
parent 5dc8d8286c
commit ae9a5a7bca
2 changed files with 49 additions and 29 deletions

View File

@@ -190,14 +190,15 @@ class Model
}
}
}
$fields = $this->getDbFields();
// 检查非数据字段
if (!empty($this->fields)) {
if (!empty($fields)) {
foreach ($data as $key => $val) {
if (!in_array($key, $this->fields, true)) {
if (!in_array($key, $fields, true)) {
unset($data[$key]);
} elseif (is_scalar($val) && empty($this->options['bind'][':' . $key])) {
// 字段类型检查
$this->_parseType($data, $key);
$this->_parseType($data, $key, $this->options['bind']);
}
}
}
@@ -777,7 +778,7 @@ class Model
$key = trim($key);
if (in_array($key, $fields, true)) {
if (is_scalar($val) && empty($options['bind'][':' . $key])) {
$this->_parseType($options['where'], $key);
$this->_parseType($options['where'], $key, $options['bind']);
}
}
}
@@ -799,18 +800,21 @@ class Model
* @param string $key 字段名
* @return void
*/
protected function _parseType(&$data, $key)
protected function _parseType(&$data, $key, &$bind)
{
if (!isset($this->options['bind'][':' . $key]) && isset($this->fields['_type'][$key])) {
if (!isset($bind[':' . $key]) && isset($this->fields['_type'][$key])) {
$fieldType = strtolower($this->fields['_type'][$key]);
if (false !== strpos($fieldType, 'enum')) {
// 支持ENUM类型优先检测
} elseif (false === strpos($fieldType, 'bigint') && false !== strpos($fieldType, 'int')) {
$data[$key] = intval($data[$key]);
$bind[':' . $key] = [$data[$key], \PDO::PARAM_INT];
$data[$key] = ':' . $key;
} elseif (false !== strpos($fieldType, 'float') || false !== strpos($fieldType, 'double')) {
$data[$key] = floatval($data[$key]);
$bind[':' . $key] = [$data[$key], \PDO::PARAM_INT];
$data[$key] = ':' . $key;
} elseif (false !== strpos($fieldType, 'bool')) {
$data[$key] = (bool) $data[$key];
$bind[':' . $key] = [$data[$key], \PDO::PARAM_BOOL];
$data[$key] = ':' . $key;
} elseif (false !== strpos($fieldType, 'json') && is_array($data[$key])) {
$data[$key] = json_encode($data[$key]);
}