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;
// 传入的表名为数组
if (is_array($join)) {
if (0 !== key($join)) {
// 键名为表名,键值作为表的别名
$table = key($join) . ' ' . current($join);
if (0 !== $key = key($join)) {
// 设置了键名则键名为表名,键值作为表的别名
$table = $key . ' ' . array_shift($join);
} 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 {
// 加上默认的表前缀
$table = $prefix . $table;

View File

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