253 lines
4.0 KiB
PHP
253 lines
4.0 KiB
PHP
<?php
|
|
/**
|
|
* Created by PhpStorm.
|
|
* User: whwyy
|
|
* Date: 2018/4/4 0004
|
|
* Time: 13:38
|
|
*/
|
|
|
|
namespace Database;
|
|
|
|
use Database\Base\AbstractCollection;
|
|
use Exception;
|
|
|
|
/**
|
|
* Class Collection
|
|
* @package Database
|
|
* @property-read $length
|
|
*/
|
|
class Collection extends AbstractCollection
|
|
{
|
|
/**
|
|
* @return int
|
|
*/
|
|
public function getLength()
|
|
{
|
|
return count($this->_item);
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public function getItems()
|
|
{
|
|
// TODO: Change the autogenerated stub
|
|
return $this->_item;
|
|
}
|
|
|
|
/**
|
|
* @param $field
|
|
*
|
|
* @return array|null
|
|
* @throws Exception
|
|
*/
|
|
public function values($field)
|
|
{
|
|
if (empty($field) || !is_string($field)) {
|
|
return NULL;
|
|
}
|
|
$_tmp = [];
|
|
$data = $this->toArray();
|
|
foreach ($data as $val) {
|
|
/** @var ActiveRecord $val */
|
|
$_tmp[] = $val[$field];
|
|
}
|
|
return $_tmp;
|
|
}
|
|
|
|
/**
|
|
* @param string $field
|
|
* @return array|null
|
|
*/
|
|
public function keyBy(string $field)
|
|
{
|
|
$array = $this->toArray();
|
|
$column = array_flip(array_column($array, $field));
|
|
foreach ($column as $key => $value) {
|
|
$column[$key] = $array[$value];
|
|
}
|
|
|
|
return $column;
|
|
}
|
|
|
|
/**
|
|
* @return $this
|
|
*/
|
|
public function orderRand()
|
|
{
|
|
shuffle($this->_item);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @param int $start
|
|
* @param int $length
|
|
*
|
|
* @return array
|
|
*/
|
|
public function slice($start = 0, $length = 20)
|
|
{
|
|
if (empty($this->_item) || !is_array($this->_item)) {
|
|
return [];
|
|
}
|
|
if (count($this->_item) < $length) {
|
|
return $this->_item;
|
|
} else {
|
|
return array_slice($this->_item, $start, $length);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param $field
|
|
* @param string $setKey
|
|
*
|
|
* @return array|null
|
|
*/
|
|
public function column($field, $setKey = '')
|
|
{
|
|
$data = $this->toArray();
|
|
if (empty($data)) {
|
|
return [];
|
|
}
|
|
if (!empty($setKey) && is_string($setKey)) {
|
|
return array_column($data, $field, $setKey);
|
|
} else {
|
|
return array_column($data, $field);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param $field
|
|
*
|
|
* @return float|int|null
|
|
*/
|
|
public function sum($field)
|
|
{
|
|
$array = $this->column($field);
|
|
if (empty($array)) {
|
|
return NULL;
|
|
}
|
|
return array_sum($array);
|
|
}
|
|
|
|
/**
|
|
* @return ActiveRecord|mixed
|
|
*/
|
|
public function current()
|
|
{
|
|
return current($this->_item);
|
|
}
|
|
|
|
/**
|
|
* @return int
|
|
*/
|
|
public function size()
|
|
{
|
|
return (int)count($this->_item);
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
* @throws
|
|
*/
|
|
public function toArray()
|
|
{
|
|
$array = [];
|
|
foreach ($this as $value) {
|
|
if (!is_object($value)) {
|
|
continue;
|
|
}
|
|
$array[] = $value->toArray();
|
|
}
|
|
$this->_item = [];
|
|
return $array;
|
|
}
|
|
|
|
/**
|
|
* @throws Exception
|
|
* 批量删除
|
|
*/
|
|
public function delete()
|
|
{
|
|
$model = $this->model;
|
|
if (!$model::hasPrimary()) {
|
|
return false;
|
|
}
|
|
$ids = [];
|
|
foreach ($this as $item) {
|
|
$ids[] = $item->{$model::getPrimary()};
|
|
}
|
|
$ids = array_filter($ids);
|
|
if (empty($ids)) {
|
|
return false;
|
|
}
|
|
return $this->model::find()
|
|
->in($model::getPrimary(), $ids)
|
|
->deleteAll();
|
|
}
|
|
|
|
/**
|
|
* @param array $condition
|
|
* @return Collection
|
|
* @throws
|
|
*/
|
|
public function filter(array $condition)
|
|
{
|
|
$_filters = [];
|
|
if (empty($condition)) {
|
|
return $this;
|
|
}
|
|
foreach ($this as $value) {
|
|
if (!$this->filterCheck($value, $condition)) {
|
|
continue;
|
|
}
|
|
$_filters[] = $value;
|
|
}
|
|
return new Collection($this->query, $_filters, $this->model);
|
|
}
|
|
|
|
|
|
/**
|
|
* @param $value
|
|
* @param $condition
|
|
* @return bool
|
|
* @throws Exception
|
|
*/
|
|
private function filterCheck($value, $condition)
|
|
{
|
|
$_value = $value;
|
|
if ($_value instanceof ActiveRecord) {
|
|
$_value = $_value->toArray();
|
|
}
|
|
$_tmp = array_intersect_key($_value, $condition);
|
|
if (count(array_diff_assoc($_tmp, $condition)) > 0) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
/**
|
|
* @param $key
|
|
* @param $value
|
|
* @return ActiveRecord|mixed|null
|
|
*/
|
|
public function exists($key, $value)
|
|
{
|
|
foreach ($this as $item) {
|
|
if ($item->$key === $value) {
|
|
return $item;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* @return bool
|
|
*/
|
|
public function isEmpty()
|
|
{
|
|
return $this->size() < 1;
|
|
}
|
|
}
|