Merge pull request #4 from oldrind/master

修正Model类join方法不能取到指定的表前缀的问题
This commit is contained in:
ThinkPHP
2016-03-30 10:52:02 +08:00
2 changed files with 72 additions and 24 deletions

View File

@@ -1477,17 +1477,15 @@ class Model
$prefix = $this->tablePrefix; $prefix = $this->tablePrefix;
// 传入的表名为数组 // 传入的表名为数组
if (is_array($join)) { if (is_array($join)) {
if (0 !== key($join)) { if (0 !== $key = key($join)) {
// 键名为表名,键值作为表的别名 // 设置了键名则键名为表名,键值作为表的别名
$table = key($join) . ' ' . current($join); $table = $key . ' ' . array_shift($join);
} else { } else {
$table = current($join); $table = array_shift($join);
}
if (isset($join[1])) {
// 第二个元素为字符串则把第二元素作为表前缀
if (is_string($join[1])) {
$table = $join[1] . $table;
} }
if (count($join)) {
// 有设置第二个元素则把第二元素作为表前缀
$table = (string) current($join) . $table;
} else { } else {
// 加上默认的表前缀 // 加上默认的表前缀
$table = $prefix . $table; $table = $prefix . $table;

View File

@@ -37,6 +37,8 @@ trait View
if (isset($view['_table'])) { if (isset($view['_table'])) {
// 2011/10/17 添加实际表名定义支持 可以实现同一个表的视图 // 2011/10/17 添加实际表名定义支持 可以实现同一个表的视图
$tableName .= $view['_table']; $tableName .= $view['_table'];
$prefix = $this->tablePrefix;
$tableName = preg_replace_callback("/__([A-Z_-]+)__/sU", function ($match) use ($prefix) {return $prefix . strtolower($match[1]);}, $tableName);
} else { } else {
$tableName .= \think\Loader::table($name)->getTableName(); $tableName .= \think\Loader::table($name)->getTableName();
} }
@@ -73,14 +75,14 @@ trait View
$val = $this->_checkFields($name, $val); $val = $this->_checkFields($name, $val);
foreach ($val as $key => $field) { foreach ($val as $key => $field) {
if (is_numeric($key)) { if (is_numeric($key)) {
$viewFields[$k . '.' . $field] = $field; $viewFields[$field] = $k . '.' . $field;
} elseif ('_' != substr($key, 0, 1)) { } elseif ('_' != substr($key, 0, 1)) {
// 以_开头的为特殊定义 // 以_开头的为特殊定义
if (false !== strpos($key, '*') || false !== strpos($key, '(') || false !== strpos($key, '.')) { if (false !== strpos($key, '*') || false !== strpos($key, '(') || false !== strpos($key, '.')) {
//如果包含* 或者 使用了sql方法 则不再添加前面的表名 //如果包含* 或者 使用了sql方法 则不再添加前面的表名
$viewFields[$key] = $field; $viewFields[$field] = $key;
} else { } else {
$viewFields[$k . '.' . $key] = $field; $viewFields[$field] = $k . '.' . $key;
} }
} }
} }
@@ -130,15 +132,63 @@ trait View
if (is_array($where)) { if (is_array($where)) {
$_where = []; $_where = [];
foreach ($where as $field => $value) { foreach ($where as $field => $value) {
if (false !== $k = array_search($field, $viewFields, true)) { if ('_complex' != $field) {
// 存在视图字段 $value = [$field => $value];
$_where[$k] = $value; $parent = 1;
} else { } else {
$_where[$field] = $value; $parent = 0;
}
foreach ($value as $key => $val) {
if (0 !== strpos($key, '_')) {
if ($items = preg_split('/[\|\&]/', $key, -1, PREG_SPLIT_OFFSET_CAPTURE)) {
// 倒序找出的字段数组,以便从后向前替换
$items = array_reverse($items);
foreach ($items as $item) {
if (isset($viewFields[$item[0]])) { // 存在视图字段
$key = substr_replace($key, $viewFields[$item[0]], $item[1], strlen($item[0]));
}
}
}
if (isset($val[0]) && 'exp' == $val[0] && !empty($val[1])) {
if (preg_match_all('/(?<![\'\.])\b(\w+)\b(?![\'])/', $val[1], $matches, PREG_OFFSET_CAPTURE)) {
// 倒序找出的字段数组,以便从后向前替换
$items = array_reverse($matches[0]);
foreach ($items as $item) {
if (isset($viewFields[$item[0]])) {
$val[1] = substr_replace($val[1], $viewFields[$item[0]], $item[1], strlen($item[0]));
}
}
}
}
} elseif (is_string($val) && ('__query' == $key || '_string' == $key)) {
if (preg_match_all('/(?<![=\'\.])\b(\w+)\b(?![&\'])/', $val, $matches, PREG_OFFSET_CAPTURE)) {
// 倒序找出的字段数组,以便从后向前替换
$items = array_reverse($matches[0]);
foreach ($items as $item) {
if (isset($viewFields[$item[0]])) {
$val = substr_replace($val, $viewFields[$item[0]], $item[1], strlen($item[0]));
}
}
}
}
if ($parent) {
$_where[$key] = $val;
} else {
$_where[$field][$key] = $val;
}
} }
} }
return $_where; return $_where;
} else { } else {
if (preg_match_all('/(?<![=\'\.])\b(\w+)\b(?![&\'])/', $where, $matches, PREG_OFFSET_CAPTURE)) {
// 倒序找出的字段数组,以便从后向前替换
$items = array_reverse($matches[0]);
foreach ($items as $item) {
if (isset($viewFields[$item[0]])) {
$where = substr_replace($where, $viewFields[$item[0]], $item[1], strlen($item[0]));
}
}
}
return $where; return $where;
} }
} }
@@ -170,9 +220,9 @@ trait View
$sort = ' ' . $field; $sort = ' ' . $field;
$field = $key; $field = $key;
} }
if (false !== $k = array_search($field, $viewFields, true)) { if (isset($viewFields[$field])) {
// 存在视图字段 // 存在视图字段
$field = $k . $sort; $field = $viewFields[$field] . $sort;
} }
$_order[] = $field; $_order[] = $field;
} }
@@ -195,9 +245,9 @@ trait View
$group = explode(',', $group); $group = explode(',', $group);
} }
foreach ($group as &$field) { foreach ($group as &$field) {
if (false !== $k = array_search($field, $viewFields, true)) { if (isset($viewFields[$field])) {
// 存在视图字段 // 存在视图字段
$field = $k; $field = $viewFields[$field];
} }
} }
@@ -238,14 +288,14 @@ trait View
// 倒序找出的字段数组,以便从后向前替换 // 倒序找出的字段数组,以便从后向前替换
$items = array_reverse($matches[0]); $items = array_reverse($matches[0]);
foreach ($items as $item) { foreach ($items as $item) {
if (false !== $k = array_search($item[0], $viewFields, true)) { if (isset($viewFields[$item[0]])) {
$field = substr_replace($field, $k, $item[1], strlen($item[0])); $field = substr_replace($field, $viewFields[$item[0]], $item[1], strlen($item[0]));
} }
} }
} }
} elseif (false !== $k = array_search($field, $viewFields, true)) { } elseif (isset($viewFields[$field])) {
// 存在视图字段 // 存在视图字段
$field = $k; $field = $viewFields[$field];
} }
$_fields[] = $field . $alias; $_fields[] = $field . $alias;
} }