diff --git a/library/think/Collection.php b/library/think/Collection.php
index 41b42759..c23395a9 100644
--- a/library/think/Collection.php
+++ b/library/think/Collection.php
@@ -225,7 +225,7 @@ class Collection implements ArrayAccess, Countable, IteratorAggregate, JsonSeria
$result = [];
foreach ($this->items as $row) {
- $key = $value = null;
+ $key = $value = null;
$keySet = $valueSet = false;
if (null !== $index_key && array_key_exists($index_key, $row)) {
$keySet = true;
diff --git a/library/think/Db.php b/library/think/Db.php
index a29dac3e..00f719e0 100644
--- a/library/think/Db.php
+++ b/library/think/Db.php
@@ -13,7 +13,6 @@ namespace think;
use think\db\Connection;
use think\db\Query;
-use think\paginator\Collection as PaginatorCollection;
/**
* Class Db
@@ -25,21 +24,21 @@ use think\paginator\Collection as PaginatorCollection;
* @method Query union(mixed $union, boolean $all = false) static UNION查询
* @method Query limit(mixed $offset, integer $length = null) static 查询LIMIT
* @method Query order(mixed $field, string $order = null) static 查询ORDER
- * @method Query cache(mixed $key = true , integer $expire = null) static 设置查询缓存
+ * @method Query cache(mixed $key = null , integer $expire = null) static 设置查询缓存
* @method mixed value(string $field) static 获取某个字段的值
* @method array column(string $field, string $key = '') static 获取某个列的值
* @method Query view(mixed $join, mixed $field = null, mixed $on = null, string $type = 'INNER') static 视图查询
- * @method mixed find(mixed $data = []) static 查询单个记录
- * @method mixed select(mixed $data = []) static 查询多个记录
+ * @method mixed find(mixed $data = null) static 查询单个记录
+ * @method mixed select(mixed $data = null) static 查询多个记录
* @method integer insert(array $data, boolean $replace = false, boolean $getLastInsID = false, string $sequence = null) static 插入一条记录
* @method integer insertGetId(array $data, boolean $replace = false, string $sequence = null) static 插入一条记录并返回自增ID
* @method integer insertAll(array $dataSet) static 插入多条记录
* @method integer update(array $data) static 更新记录
- * @method integer delete(mixed $data = []) static 删除记录
+ * @method integer delete(mixed $data = null) static 删除记录
* @method boolean chunk(integer $count, callable $callback, string $column = null) static 分块获取数据
- * @method mixed query(string $sql, array $bind = [], boolean $fetch = false, boolean $master = false, mixed $class = false) static SQL查询
+ * @method mixed query(string $sql, array $bind = [], boolean $fetch = false, boolean $master = false, mixed $class = null) static SQL查询
* @method integer execute(string $sql, array $bind = [], boolean $fetch = false, boolean $getLastInsID = false, string $sequence = null) static SQL执行
- * @method PaginatorCollection paginate(integer $listRows = 15, mixed $simple = false, array $config = []) static 分页查询
+ * @method Paginator paginate(integer $listRows = 15, mixed $simple = null, array $config = []) static 分页查询
* @method mixed transaction(callable $callback) static 执行数据库事务
* @method void startTrans() static 启动事务
* @method void commit() static 用于非自动提交状态下面的查询提交
diff --git a/library/think/Paginator.php b/library/think/Paginator.php
index d2fe79d2..0c1bea8a 100644
--- a/library/think/Paginator.php
+++ b/library/think/Paginator.php
@@ -11,14 +11,19 @@
namespace think;
-use think\paginator\Collection as PaginatorCollection;
+use ArrayAccess;
+use ArrayIterator;
+use Countable;
+use IteratorAggregate;
+use JsonSerializable;
+use Traversable;
-abstract class Paginator
+abstract class Paginator implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable
{
/** @var bool 是否为简洁模式 */
protected $simple = false;
- /** @var PaginatorCollection 数据集 */
+ /** @var Collection 数据集 */
protected $items;
/** @var integer 当前页 */
@@ -44,7 +49,7 @@ abstract class Paginator
'fragment' => '',
];
- protected function __construct($items, $listRows, $currentPage = null, $total = null, $simple = false, $options = [])
+ public function __construct($items, $listRows, $currentPage = null, $total = null, $simple = false, $options = [])
{
$this->options = array_merge($this->options, $options);
@@ -53,10 +58,11 @@ abstract class Paginator
$this->simple = $simple;
$this->listRows = $listRows;
+ if (!$items instanceof Collection) {
+ $items = Collection::make($items);
+ }
+
if ($simple) {
- if (!$items instanceof Collection) {
- $items = Collection::make($items);
- }
$this->currentPage = $this->setCurrentPage($currentPage);
$this->hasMore = count($items) > ($this->listRows);
$items = $items->slice(0, $this->listRows);
@@ -66,8 +72,7 @@ abstract class Paginator
$this->currentPage = $this->setCurrentPage($currentPage);
$this->hasMore = $this->currentPage < $this->lastPage;
}
-
- $this->items = PaginatorCollection::make($items, $this);
+ $this->items = $items;
}
/**
@@ -77,12 +82,11 @@ abstract class Paginator
* @param bool $simple
* @param null $total
* @param array $options
- * @return PaginatorCollection
+ * @return Paginator
*/
public static function make($items, $listRows, $currentPage = null, $total = null, $simple = false, $options = [])
{
- $paginator = new static($items, $listRows, $currentPage, $total, $simple, $options);
- return $paginator->items;
+ return new static($items, $listRows, $currentPage, $total, $simple, $options);
}
protected function setCurrentPage($currentPage)
@@ -253,4 +257,113 @@ abstract class Paginator
* @return mixed
*/
abstract public function render();
+
+ public function items()
+ {
+ return $this->items->all();
+ }
+
+ public function getCollection()
+ {
+ return $this->items;
+ }
+
+ public function isEmpty()
+ {
+ return $this->items->isEmpty();
+ }
+
+ /**
+ * Retrieve an external iterator
+ * @return Traversable An instance of an object implementing Iterator or
+ * Traversable
+ */
+ public function getIterator()
+ {
+ return new ArrayIterator($this->items->all());
+ }
+
+ /**
+ * Whether a offset exists
+ * @param mixed $offset
+ * @return bool
+ */
+ public function offsetExists($offset)
+ {
+ return $this->items->offsetExists($offset);
+ }
+
+ /**
+ * Offset to retrieve
+ * @param mixed $offset
+ * @return mixed
+ */
+ public function offsetGet($offset)
+ {
+ return $this->items->offsetGet($offset);
+ }
+
+ /**
+ * Offset to set
+ * @param mixed $offset
+ * @param mixed $value
+ */
+ public function offsetSet($offset, $value)
+ {
+ $this->items->offsetSet($offset, $value);
+ }
+
+ /**
+ * Offset to unset
+ * @param mixed $offset
+ * @return void
+ * @since 5.0.0
+ */
+ public function offsetUnset($offset)
+ {
+ $this->items->offsetUnset($offset);
+ }
+
+ /**
+ * Count elements of an object
+ */
+ public function count()
+ {
+ return $this->items->count();
+ }
+
+ public function __toString()
+ {
+ return (string) $this->render();
+ }
+
+ public function toArray()
+ {
+ try {
+ $total = $this->total();
+ } catch (Exception $e) {
+ $total = null;
+ }
+
+ return [
+ 'total' => $total,
+ 'per_page' => $this->listRows(),
+ 'current_page' => $this->currentPage(),
+ 'data' => $this->items->toArray()
+ ];
+ }
+
+ /**
+ * Specify data which should be serialized to JSON
+ */
+ public function jsonSerialize()
+ {
+ return $this->toArray();
+ }
+
+ public function __call($name, $arguments)
+ {
+ return call_user_func_array([$this->getCollection(), $name], $arguments);
+ }
+
}
diff --git a/library/think/db/Query.php b/library/think/db/Query.php
index 45c66ccf..da5990a8 100644
--- a/library/think/db/Query.php
+++ b/library/think/db/Query.php
@@ -229,8 +229,8 @@ class Query
/**
* 执行语句
* @access public
- * @param string $sql sql指令
- * @param array $bind 参数绑定
+ * @param string $sql sql指令
+ * @param array $bind 参数绑定
* @return int
* @throws BindParamException
* @throws PDOException
@@ -243,7 +243,7 @@ class Query
/**
* 获取最近插入的ID
* @access public
- * @param string $sequence 自增序列名
+ * @param string $sequence 自增序列名
* @return string
*/
public function getLastInsID($sequence = null)
@@ -390,7 +390,7 @@ class Query
* @access public
* @param string $field 字段名
* @param mixed $default 默认值
- * @param bool $force 强制转为数字类型
+ * @param bool $force 强制转为数字类型
* @return mixed
*/
public function value($field, $default = null, $force = false)
@@ -694,7 +694,7 @@ class Query
* 获取Join表名及别名 支持
* ['prefix_table或者子查询'=>'alias'] 'prefix_table alias' 'table alias'
* @access public
- * @param array|string $join
+ * @param array|string $join
* @return array|string
*/
protected function getJoinTable($join, &$alias = null)
@@ -817,8 +817,8 @@ class Query
/**
* 字段值增长
* @access public
- * @param string|array $field 字段名
- * @param integer $step 增长值
+ * @param string|array $field 字段名
+ * @param integer $step 增长值
* @return $this
*/
public function inc($field, $step = 1)
@@ -833,8 +833,8 @@ class Query
/**
* 字段值减少
* @access public
- * @param string|array $field 字段名
- * @param integer $step 增长值
+ * @param string|array $field 字段名
+ * @param integer $step 增长值
* @return $this
*/
public function dec($field, $step = 1)
@@ -849,8 +849,8 @@ class Query
/**
* 使用表达式设置数据
* @access public
- * @param string $field 字段名
- * @param string $value 字段值
+ * @param string $field 字段名
+ * @param string $value 字段值
* @return $this
*/
public function exp($field, $value)
@@ -975,8 +975,8 @@ class Query
/**
* 指定Null查询条件
* @access public
- * @param mixed $field 查询字段
- * @param string $logic 查询逻辑 and or xor
+ * @param mixed $field 查询字段
+ * @param string $logic 查询逻辑 and or xor
* @return $this
*/
public function whereNull($field, $logic = 'AND')
@@ -988,8 +988,8 @@ class Query
/**
* 指定NotNull查询条件
* @access public
- * @param mixed $field 查询字段
- * @param string $logic 查询逻辑 and or xor
+ * @param mixed $field 查询字段
+ * @param string $logic 查询逻辑 and or xor
* @return $this
*/
public function whereNotNull($field, $logic = 'AND')
@@ -1001,8 +1001,8 @@ class Query
/**
* 指定Exists查询条件
* @access public
- * @param mixed $condition 查询条件
- * @param string $logic 查询逻辑 and or xor
+ * @param mixed $condition 查询条件
+ * @param string $logic 查询逻辑 and or xor
* @return $this
*/
public function whereExists($condition, $logic = 'AND')
@@ -1014,8 +1014,8 @@ class Query
/**
* 指定NotExists查询条件
* @access public
- * @param mixed $condition 查询条件
- * @param string $logic 查询逻辑 and or xor
+ * @param mixed $condition 查询条件
+ * @param string $logic 查询逻辑 and or xor
* @return $this
*/
public function whereNotExists($condition, $logic = 'AND')
@@ -1027,9 +1027,9 @@ class Query
/**
* 指定In查询条件
* @access public
- * @param mixed $field 查询字段
- * @param mixed $condition 查询条件
- * @param string $logic 查询逻辑 and or xor
+ * @param mixed $field 查询字段
+ * @param mixed $condition 查询条件
+ * @param string $logic 查询逻辑 and or xor
* @return $this
*/
public function whereIn($field, $condition, $logic = 'AND')
@@ -1041,9 +1041,9 @@ class Query
/**
* 指定NotIn查询条件
* @access public
- * @param mixed $field 查询字段
- * @param mixed $condition 查询条件
- * @param string $logic 查询逻辑 and or xor
+ * @param mixed $field 查询字段
+ * @param mixed $condition 查询条件
+ * @param string $logic 查询逻辑 and or xor
* @return $this
*/
public function whereNotIn($field, $condition, $logic = 'AND')
@@ -1055,9 +1055,9 @@ class Query
/**
* 指定Like查询条件
* @access public
- * @param mixed $field 查询字段
- * @param mixed $condition 查询条件
- * @param string $logic 查询逻辑 and or xor
+ * @param mixed $field 查询字段
+ * @param mixed $condition 查询条件
+ * @param string $logic 查询逻辑 and or xor
* @return $this
*/
public function whereLike($field, $condition, $logic = 'AND')
@@ -1069,9 +1069,9 @@ class Query
/**
* 指定NotLike查询条件
* @access public
- * @param mixed $field 查询字段
- * @param mixed $condition 查询条件
- * @param string $logic 查询逻辑 and or xor
+ * @param mixed $field 查询字段
+ * @param mixed $condition 查询条件
+ * @param string $logic 查询逻辑 and or xor
* @return $this
*/
public function whereNotLike($field, $condition, $logic = 'AND')
@@ -1083,9 +1083,9 @@ class Query
/**
* 指定Between查询条件
* @access public
- * @param mixed $field 查询字段
- * @param mixed $condition 查询条件
- * @param string $logic 查询逻辑 and or xor
+ * @param mixed $field 查询字段
+ * @param mixed $condition 查询条件
+ * @param string $logic 查询逻辑 and or xor
* @return $this
*/
public function whereBetween($field, $condition, $logic = 'AND')
@@ -1097,9 +1097,9 @@ class Query
/**
* 指定NotBetween查询条件
* @access public
- * @param mixed $field 查询字段
- * @param mixed $condition 查询条件
- * @param string $logic 查询逻辑 and or xor
+ * @param mixed $field 查询字段
+ * @param mixed $condition 查询条件
+ * @param string $logic 查询逻辑 and or xor
* @return $this
*/
public function whereNotBetween($field, $condition, $logic = 'AND')
@@ -1111,9 +1111,9 @@ class Query
/**
* 指定Exp查询条件
* @access public
- * @param mixed $field 查询字段
- * @param mixed $condition 查询条件
- * @param string $logic 查询逻辑 and or xor
+ * @param mixed $field 查询字段
+ * @param mixed $condition 查询条件
+ * @param string $logic 查询逻辑 and or xor
* @return $this
*/
public function whereExp($field, $condition, $logic = 'AND')
@@ -1202,8 +1202,8 @@ class Query
/**
* 检查是否存在一个字段多次查询条件
* @access public
- * @param string $field 查询字段
- * @param string $logic 查询逻辑 and or xor
+ * @param string $field 查询字段
+ * @param string $logic 查询逻辑 and or xor
* @return bool
*/
private function checkMultiField($field, $logic)
@@ -1214,8 +1214,8 @@ class Query
/**
* 去除某个查询条件
* @access public
- * @param string $field 查询字段
- * @param string $logic 查询逻辑 and or xor
+ * @param string $field 查询字段
+ * @param string $logic 查询逻辑 and or xor
* @return $this
*/
public function removeWhereField($field, $logic = 'AND')
@@ -1230,7 +1230,7 @@ class Query
/**
* 去除查询参数
* @access public
- * @param string|bool $option 参数名 true 表示去除所有参数
+ * @param string|bool $option 参数名 true 表示去除所有参数
* @return $this
*/
public function removeOption($option = true)
@@ -1280,14 +1280,14 @@ class Query
* @param int|array $listRows 每页数量 数组表示配置参数
* @param int|bool $simple 是否简洁模式或者总记录数
* @param array $config 配置参数
- * page:当前页,
- * path:url路径,
- * query:url额外参数,
- * fragment:url锚点,
- * var_page:分页变量,
- * list_rows:每页数量
- * type:分页类名
- * @return \think\paginator\Collection
+ * page:当前页,
+ * path:url路径,
+ * query:url额外参数,
+ * fragment:url锚点,
+ * var_page:分页变量,
+ * list_rows:每页数量
+ * type:分页类名
+ * @return \think\Paginator
* @throws DbException
*/
public function paginate($listRows = null, $simple = false, $config = [])
@@ -1317,9 +1317,9 @@ class Query
if (!isset($total) && !$simple) {
$options = $this->getOptions();
- if (isset($options['order'])) {
- unset($this->options['order']);
- }
+
+ unset($this->options['order'], $this->options['limit'], $this->options['page'], $this->options['field']);
+
$bind = $this->bind;
$total = $this->count();
$results = $this->options($options)->bind($bind)->page($page, $listRows)->select();
@@ -1710,7 +1710,7 @@ class Query
}
list($guid) = explode(' ', $tableName);
- $db = $this->getConfig('database');
+ $db = $this->getConfig('database');
if (!isset(self::$info[$db . '.' . $guid])) {
if (!strpos($guid, '.')) {
$schema = $db . '.' . $guid;
@@ -1724,7 +1724,7 @@ class Query
$info = $this->connection->getFields($guid);
}
$fields = array_keys($info);
- $bind = $type = [];
+ $bind = $type = [];
foreach ($info as $key => $val) {
// 记录字段类型
$type[$key] = $val['type'];
@@ -1889,7 +1889,7 @@ class Query
$relation = $key;
$with[$key] = $key;
} elseif (is_string($relation) && strpos($relation, '.')) {
- $with[$key] = $relation;
+ $with[$key] = $relation;
list($relation, $subRelation) = explode('.', $relation, 2);
}
@@ -1911,8 +1911,8 @@ class Query
/**
* 关联统计
* @access public
- * @param string|array $relation 关联方法名
- * @param bool $subQuery 是否使用子查询
+ * @param string|array $relation 关联方法名
+ * @param bool $subQuery 是否使用子查询
* @return $this
*/
public function withCount($relation, $subQuery = true)
@@ -2227,7 +2227,7 @@ class Query
if ($data instanceof Query) {
return $data->select();
} elseif ($data instanceof \Closure) {
- call_user_func_array($data, [ & $this]);
+ call_user_func_array($data, [& $this]);
$data = null;
}
// 分析查询表达式
@@ -2327,7 +2327,7 @@ class Query
if ($data instanceof Query) {
return $data->find();
} elseif ($data instanceof \Closure) {
- call_user_func_array($data, [ & $this]);
+ call_user_func_array($data, [& $this]);
$data = null;
}
// 分析查询表达式
@@ -2659,10 +2659,10 @@ class Query
if (isset($options['page'])) {
// 根据页数计算limit
list($page, $listRows) = $options['page'];
- $page = $page > 0 ? $page : 1;
- $listRows = $listRows > 0 ? $listRows : (is_numeric($options['limit']) ? $options['limit'] : 20);
- $offset = $listRows * ($page - 1);
- $options['limit'] = $offset . ',' . $listRows;
+ $page = $page > 0 ? $page : 1;
+ $listRows = $listRows > 0 ? $listRows : (is_numeric($options['limit']) ? $options['limit'] : 20);
+ $offset = $listRows * ($page - 1);
+ $options['limit'] = $offset . ',' . $listRows;
}
$this->options = [];
@@ -2672,8 +2672,8 @@ class Query
/**
* 注册回调方法
* @access public
- * @param string $event 事件名
- * @param callable $callback 回调方法
+ * @param string $event 事件名
+ * @param callable $callback 回调方法
* @return void
*/
public static function event($event, $callback)
@@ -2684,8 +2684,8 @@ class Query
/**
* 触发事件
* @access protected
- * @param string $event 事件名
- * @param mixed $options 当前查询参数
+ * @param string $event 事件名
+ * @param mixed $options 当前查询参数
* @return bool
*/
protected function trigger($event, $options = [])
diff --git a/library/think/paginator/Collection.php b/library/think/paginator/Collection.php
deleted file mode 100644
index 0c877388..00000000
--- a/library/think/paginator/Collection.php
+++ /dev/null
@@ -1,74 +0,0 @@
-
-// +----------------------------------------------------------------------
-
-namespace think\paginator;
-
-use Exception;
-use think\Paginator;
-
-/**
- * Class Collection
- * @package think\paginator
- * @method integer total()
- * @method integer listRows()
- * @method integer currentPage()
- * @method string render()
- * @method Paginator fragment($fragment)
- * @method Paginator appends($key, $value)
- * @method integer lastPage()
- * @method boolean hasPages()
- */
-class Collection extends \think\Collection
-{
-
- /** @var Paginator */
- protected $paginator;
-
- public function __construct($items = [], Paginator $paginator = null)
- {
- $this->paginator = $paginator;
- parent::__construct($items);
- }
-
- public static function make($items = [], Paginator $paginator = null)
- {
- return new static($items, $paginator);
- }
-
- public function toArray()
- {
- if ($this->paginator) {
- try {
- $total = $this->total();
- } catch (Exception $e) {
- $total = null;
- }
-
- return [
- 'total' => $total,
- 'per_page' => $this->listRows(),
- 'current_page' => $this->currentPage(),
- 'data' => parent::toArray()
- ];
- } else {
- return parent::toArray();
- }
- }
-
- public function __call($method, $args)
- {
- if ($this->paginator && method_exists($this->paginator, $method)) {
- return call_user_func_array([$this->paginator, $method], $args);
- } else {
- throw new Exception('method not exists:' . __CLASS__ . '->' . $method);
- }
- }
-}