From e462a05a001353fa40f64034e9dacb640815dd74 Mon Sep 17 00:00:00 2001 From: oldrind <1401019000@qq.com> Date: Wed, 30 Mar 2016 10:37:05 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=86=E5=9B=BE=E6=A8=A1=E5=9E=8B=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=AF=B9where=E7=BB=84=E5=90=88=E6=9D=A1=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=E5=AD=97=E6=AE=B5=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- library/traits/model/View.php | 80 ++++++++++++++++++++++++++++------- 1 file changed, 65 insertions(+), 15 deletions(-) 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('/(?