rabin 8 months ago
parent
commit
d3bb7df520
4 changed files with 41 additions and 8 deletions
  1. 2 2
      boot.php
  2. 19 3
      src/Dever/Model.php
  3. 9 3
      src/Dever/Sql.php
  4. 11 0
      src/Dever/Store/Pdo.php

+ 2 - 2
boot.php

@@ -50,8 +50,8 @@ class Dever
         if (strpos($class, '?')) {
             list($class, $temp) = explode('?', $class);
             parse_str($temp, $temp);
-            $param[0] = array_merge($param[0], $temp);
-        } 
+            $param[] = $temp;
+        }
         if (strpos($class, '.')) {
             list($class, $method) = explode('.', $class);
             $call = 'load';

+ 19 - 3
src/Dever/Model.php

@@ -94,7 +94,7 @@ class Model
                 $file .= $this->partition['table'] . '.php';
             }
             if (isset($this->partition['field']) && $this->partition['field']) {
-                if (strstr($this->partition['field']['value'], 'date(')) {
+                if (is_string($this->partition['field']['value']) && strstr($this->partition['field']['value'], 'date(')) {
                     $this->partition['field']['type'] = 'time';
                     $e = '$v=' . $this->partition['field']['value'] . ';';
                     eval($e);
@@ -122,6 +122,10 @@ class Model
             }
         }
     }
+    public function optimize()
+    {
+        return $this->store->optimize($this->config['table']);
+    }
     public function load($param, $set = array(), $lock = false)
     {
         return $this->store->load($this->config['table'], $param, $set, $this->config['struct'], $lock);
@@ -133,7 +137,11 @@ class Model
         }
         if (empty($set['order'])) {
             if (isset($this->config['order'])) {
-                $set['order'] = $this->config['order'] . ',id desc';
+                if (strstr($this->config['order'], 'id asc')) {
+                    $set['order'] = $this->config['order'];
+                } else {
+                    $set['order'] = $this->config['order'] . ',id desc';
+                }
             } else {
                 $set['order'] = 'id desc';
             }
@@ -162,6 +170,10 @@ class Model
         if (isset($this->partition['where']) && $this->partition['where']) {
             $param = array_merge($this->partition['where'], $param);
         }
+        if (isset($this->config['count']) && $this->config['count'] = 2) {
+            $data = $this->store->explain($this->config['table'], $param, $this->config['struct']);
+            return $data['rows'] ?? 0;
+        }
         return $this->store->count($this->config['table'], $param, $this->config['struct']);
     }
     public function kv($param, $set = array())
@@ -240,7 +252,11 @@ class Model
                 $temp = explode('limit', $sql);
                 $sql = $temp[0];
             }
-            $sql .= ' limit ' . Paginator::init($page['num'], $page['page'] ?? 1, function()use($sql, $bind){return $this->queryCount($sql, $bind);});
+            $limit = Paginator::init($page['num'], $page['page'] ?? 1, function()use($sql, $bind){return $this->queryCount($sql, $bind);});
+            if (is_array($limit)) {
+                $limit = implode(',', $limit);
+            }
+            $sql .= ' limit ' . $limit;
         }
         $result = $this->store->query($sql, $bind);
         if (isset($page['num']) && empty($page['page'])) {

+ 9 - 3
src/Dever/Sql.php

@@ -9,10 +9,14 @@ class Sql
     {
         return 'TRUNCATE TABLE `' . $table . '`';
     }
-    public static function opt($table)
+    public static function optimize($table)
     {
         return 'OPTIMIZE TABLE `' . $table . '`';
     }
+    public static function analyze($table)
+    {
+        return 'ANALYZE TABLE `' . $table . '`';
+    }
     public static function explain($sql)
     {
         return 'EXPLAIN ' . $sql;
@@ -132,10 +136,12 @@ class Sql
             $sql = 'PARTITION p'.$name.' VALUES LESS THAN ('.$partition['value'].')';
             return $alter . '('.$sql.')';
         } elseif ($partition['type'] == 'list') {
-            $sql = '';
+            $sql = [];
             foreach ($partition['value'] as $k => $v) {
-                $sql = 'PARTITION p'.$v['name'].' VALUES IN ('.$v['value'].')';
+                $k = str_replace('-', '_', $v);
+                $sql[] = 'PARTITION p'.$k.' VALUES IN ('.$v.')';
             }
+            $sql = implode(',', $sql);
             return $alter . '('.$sql.')';
         } elseif ($partition['type'] == 'hash' || $partition['type'] == 'key') {
             if ($state) {

+ 11 - 0
src/Dever/Store/Pdo.php

@@ -129,6 +129,12 @@ class Pdo extends Base
     {
         return $this->load($table, $param, array('col'=>'count(*)'), $field, false)->fetch(\PDO::FETCH_NUM)[0];
     }
+    public function explain($table, $param, $field)
+    {
+        $bind = array();
+        $sql = sql::explain(Sql::select($table, $param, $bind, array('col'=>'count(*)'), $field, false));
+        return $this->query($sql, $bind)->fetch();
+    }
     public function insert($table, $data, $field)
     {
         $bind = array();
@@ -148,6 +154,11 @@ class Pdo extends Base
         $sql = Sql::delete($table, $param, $bind, $field);
         return $this->query($sql, $bind, 'update')->rowCount();
     }
+    public function optimize($table)
+    {
+        $sql = Sql::optimize($table) . ';' . Sql::analyze($table);
+        return $this->query($sql, array(), 'update');
+    }
     public function begin()
     {
         $this->update->beginTransaction();