diff --git a/library/traits/model/View.php b/library/traits/model/View.php index 872dc70c..d4a7c3ec 100644 --- a/library/traits/model/View.php +++ b/library/traits/model/View.php @@ -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('/(?