Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 547bb85ba9 | |||
| 4ddcc87263 | |||
| 31a6862d62 | |||
| 6e1d1a300a | |||
| e260e43c17 | |||
| 76292522e4 | |||
| 7eb6151111 |
+284
-253
@@ -11,6 +11,7 @@ namespace Database;
|
|||||||
|
|
||||||
use Database\Traits\QueryTrait;
|
use Database\Traits\QueryTrait;
|
||||||
use Exception;
|
use Exception;
|
||||||
|
use JetBrains\PhpStorm\ArrayShape;
|
||||||
use Kiri\Abstracts\Component;
|
use Kiri\Abstracts\Component;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -20,290 +21,320 @@ use Kiri\Abstracts\Component;
|
|||||||
class ActiveQuery extends Component implements ISqlBuilder
|
class ActiveQuery extends Component implements ISqlBuilder
|
||||||
{
|
{
|
||||||
|
|
||||||
use QueryTrait;
|
use QueryTrait;
|
||||||
|
|
||||||
/** @var array */
|
/** @var array */
|
||||||
public array $with = [];
|
public array $with = [];
|
||||||
|
|
||||||
/** @var bool */
|
/** @var bool */
|
||||||
public bool $asArray = FALSE;
|
public bool $asArray = FALSE;
|
||||||
|
|
||||||
/** @var bool */
|
/** @var bool */
|
||||||
public bool $useCache = FALSE;
|
public bool $useCache = FALSE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var Connection|null
|
* @var Connection|null
|
||||||
*/
|
*/
|
||||||
public ?Connection $db = NULL;
|
public ?Connection $db = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var array
|
* @var array
|
||||||
* 参数绑定
|
* 参数绑定
|
||||||
*/
|
*/
|
||||||
public array $attributes = [];
|
public array $attributes = [];
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Comply constructor.
|
* Comply constructor.
|
||||||
* @param $model
|
* @param $model
|
||||||
* @param array $config
|
* @param array $config
|
||||||
* @throws
|
* @throws
|
||||||
*/
|
*/
|
||||||
public function __construct($model, array $config = [])
|
public function __construct($model, array $config = [])
|
||||||
{
|
{
|
||||||
$this->modelClass = $model;
|
$this->modelClass = $model;
|
||||||
|
|
||||||
$this->builder = SqlBuilder::builder($this);
|
$this->builder = SqlBuilder::builder($this);
|
||||||
parent::__construct($config);
|
parent::__construct($config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 清除不完整数据
|
* 清除不完整数据
|
||||||
*/
|
*/
|
||||||
public function clear()
|
public function clear()
|
||||||
{
|
{
|
||||||
$this->db = null;
|
$this->db = NULL;
|
||||||
$this->useCache = false;
|
$this->useCache = FALSE;
|
||||||
$this->with = [];
|
$this->with = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $key
|
* @param $key
|
||||||
* @param $value
|
* @param $value
|
||||||
* @return $this
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function addParam($key, $value): static
|
public function addParam($key, $value): static
|
||||||
{
|
{
|
||||||
$this->attributes[$key] = $value;
|
$this->attributes[$key] = $value;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $values
|
|
||||||
* @return $this
|
|
||||||
*/
|
|
||||||
public function addParams(array $values): static
|
|
||||||
{
|
|
||||||
foreach ($values as $key => $val) {
|
|
||||||
$this->addParam($key, $val);
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param $name
|
|
||||||
* @return $this
|
|
||||||
*/
|
|
||||||
public function with($name): static
|
|
||||||
{
|
|
||||||
if (empty($name)) {
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
if (is_string($name)) {
|
|
||||||
$name = explode(',', $name);
|
|
||||||
}
|
|
||||||
foreach ($name as $val) {
|
|
||||||
array_push($this->with, $val);
|
|
||||||
}
|
|
||||||
return $this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $sql
|
* @param int $size
|
||||||
* @param array $params
|
* @param int $page
|
||||||
* @return mixed
|
* @return array
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public function execute($sql, array $params = []): Command
|
#[ArrayShape(['code' => "int", 'message' => "string", 'size' => "mixed", 'page' => "mixed", 'count' => "int", 'next' => "mixed", 'prev' => "mixed", 'param' => "array"])]
|
||||||
{
|
public function pagination(int $size = 20, int $page = 1): array
|
||||||
return $this->modelClass->getConnection()->createCommand($sql, $params);
|
{
|
||||||
}
|
$page = max(1, $page);
|
||||||
|
$size = max(1, $size);
|
||||||
|
|
||||||
|
$offset = ($page - 1) * $size;
|
||||||
|
|
||||||
|
$count = $this->count();
|
||||||
|
$lists = $this->limit($offset, $size)->get()->toArray();
|
||||||
|
return [
|
||||||
|
'code' => 0,
|
||||||
|
'message' => 'ok',
|
||||||
|
'size' => $size,
|
||||||
|
'page' => $page,
|
||||||
|
'count' => $count,
|
||||||
|
'next' => max($page + 1, 1),
|
||||||
|
'prev' => max($page - 1, 1),
|
||||||
|
'param' => $lists,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return ModelInterface|null
|
* @param array $values
|
||||||
* @throws Exception
|
* @return $this
|
||||||
*/
|
*/
|
||||||
public function first(): ModelInterface|null
|
public function addParams(array $values): static
|
||||||
{
|
{
|
||||||
$data = $this->execute($this->builder->one())->one();
|
foreach ($values as $key => $val) {
|
||||||
if (empty($data)) {
|
$this->addParam($key, $val);
|
||||||
return NULL;
|
}
|
||||||
}
|
return $this;
|
||||||
return $this->populate($data);
|
}
|
||||||
}
|
|
||||||
|
/**
|
||||||
|
* @param $name
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function with($name): static
|
||||||
|
{
|
||||||
|
if (empty($name)) {
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
if (is_string($name)) {
|
||||||
|
$name = explode(',', $name);
|
||||||
|
}
|
||||||
|
foreach ($name as $val) {
|
||||||
|
array_push($this->with, $val);
|
||||||
|
}
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return string
|
* @param $sql
|
||||||
* @throws Exception
|
* @param array $params
|
||||||
*/
|
* @return mixed
|
||||||
public function toSql(): string
|
* @throws Exception
|
||||||
{
|
*/
|
||||||
return $this->builder->get();
|
public function execute($sql, array $params = []): Command
|
||||||
}
|
{
|
||||||
|
return $this->modelClass->getConnection()->createCommand($sql, $params);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return array|Collection
|
* @return ModelInterface|null
|
||||||
*/
|
* @throws Exception
|
||||||
public function get(): Collection|array
|
*/
|
||||||
{
|
public function first(): ModelInterface|null
|
||||||
return $this->all();
|
{
|
||||||
}
|
$data = $this->execute($this->builder->one())->one();
|
||||||
|
if (empty($data)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return $this->populate($data);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws Exception
|
* @return string
|
||||||
*/
|
* @throws Exception
|
||||||
public function flush(): array|bool|int|string|null
|
*/
|
||||||
{
|
public function toSql(): string
|
||||||
return $this->execute($this->builder->truncate())->exec();
|
{
|
||||||
}
|
return $this->builder->get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param int $size
|
* @return array|Collection
|
||||||
* @param callable $callback
|
*/
|
||||||
* @return Pagination
|
public function get(): Collection|array
|
||||||
* @throws Exception
|
{
|
||||||
*/
|
return $this->all();
|
||||||
public function page(int $size, callable $callback): Pagination
|
}
|
||||||
{
|
|
||||||
$pagination = new Pagination($this);
|
|
||||||
$pagination->setOffset(0);
|
|
||||||
$pagination->setLimit($size);
|
|
||||||
$pagination->setCallback($callback);
|
|
||||||
return $pagination;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $field
|
|
||||||
* @param string $setKey
|
|
||||||
*
|
|
||||||
* @return array|null
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function column(string $field, string $setKey = ''): ?array
|
|
||||||
{
|
|
||||||
return $this->all()->column($field, $setKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return array|Collection
|
|
||||||
* @throws
|
|
||||||
*/
|
|
||||||
public function all(): Collection|array
|
|
||||||
{
|
|
||||||
$data = $this->execute($this->builder->all())->all();
|
|
||||||
if (!empty($this->with)){
|
|
||||||
$this->getWith($this->modelClass);
|
|
||||||
}
|
|
||||||
$collect = new Collection($this, $data, $this->modelClass);
|
|
||||||
if ($this->asArray) {
|
|
||||||
return $collect->toArray();
|
|
||||||
}
|
|
||||||
return $collect;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param $data
|
|
||||||
* @return ModelInterface
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function populate($data): ModelInterface
|
|
||||||
{
|
|
||||||
return $this->getWith($this->modelClass::populate($data));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param ModelInterface $model
|
* @throws Exception
|
||||||
* @return ModelInterface
|
*/
|
||||||
*/
|
public function flush(): array|bool|int|string|null
|
||||||
public function getWith(ModelInterface $model): ModelInterface
|
{
|
||||||
{
|
return $this->execute($this->builder->truncate())->exec();
|
||||||
if (empty($this->with) || !is_array($this->with)) {
|
}
|
||||||
return $model;
|
|
||||||
}
|
|
||||||
return $model->setWith($this->with);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return int
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function count(): int
|
|
||||||
{
|
|
||||||
$data = $this->execute($this->builder->count())->one();
|
|
||||||
if ($data && is_array($data)) {
|
|
||||||
return (int)array_shift($data);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array $data
|
* @param int $size
|
||||||
* @return array|Command|bool|int|string
|
* @param callable $callback
|
||||||
* @throws Exception
|
* @return Pagination
|
||||||
*/
|
* @throws Exception
|
||||||
public function batchUpdate(array $data): Command|array|bool|int|string
|
*/
|
||||||
{
|
public function page(int $size, callable $callback): Pagination
|
||||||
$generate = $this->builder->update($data);
|
{
|
||||||
if (is_bool($generate)) {
|
$pagination = new Pagination($this);
|
||||||
return $generate;
|
$pagination->setOffset(0);
|
||||||
}
|
$pagination->setLimit($size);
|
||||||
return $this->execute(...$generate)->exec();
|
$pagination->setCallback($callback);
|
||||||
}
|
return $pagination;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param array $data
|
* @param string $field
|
||||||
* @return bool
|
* @param string $setKey
|
||||||
* @throws Exception
|
*
|
||||||
*/
|
* @return array|null
|
||||||
public function batchInsert(array $data): bool
|
* @throws Exception
|
||||||
{
|
*/
|
||||||
[$sql, $params] = $this->builder->insert($data, true);
|
public function column(string $field, string $setKey = ''): ?array
|
||||||
|
{
|
||||||
|
return $this->all()->column($field, $setKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array|Collection
|
||||||
|
* @throws
|
||||||
|
*/
|
||||||
|
public function all(): Collection|array
|
||||||
|
{
|
||||||
|
$data = $this->execute($this->builder->all())->all();
|
||||||
|
if (!empty($this->with)) {
|
||||||
|
$this->getWith($this->modelClass);
|
||||||
|
}
|
||||||
|
$collect = new Collection($this, $data, $this->modelClass);
|
||||||
|
if ($this->asArray) {
|
||||||
|
return $collect->toArray();
|
||||||
|
}
|
||||||
|
return $collect;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $data
|
||||||
|
* @return ModelInterface
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public function populate($data): ModelInterface
|
||||||
|
{
|
||||||
|
return $this->getWith($this->modelClass::populate($data));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
return $this->execute($sql, $params)->exec();
|
/**
|
||||||
}
|
* @param ModelInterface $model
|
||||||
|
* @return ModelInterface
|
||||||
|
*/
|
||||||
|
public function getWith(ModelInterface $model): ModelInterface
|
||||||
|
{
|
||||||
|
if (empty($this->with) || !is_array($this->with)) {
|
||||||
|
return $model;
|
||||||
|
}
|
||||||
|
return $model->setWith($this->with);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param $filed
|
* @return int
|
||||||
*
|
* @throws Exception
|
||||||
* @return null
|
*/
|
||||||
* @throws Exception
|
public function count(): int
|
||||||
*/
|
{
|
||||||
public function value($filed)
|
$data = $this->execute($this->builder->count())->one();
|
||||||
{
|
if ($data && is_array($data)) {
|
||||||
return $this->first()[$filed] ?? null;
|
return (int)array_shift($data);
|
||||||
}
|
}
|
||||||
|
return 0;
|
||||||
/**
|
}
|
||||||
* @return bool
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public function exists(): bool
|
|
||||||
{
|
|
||||||
return !empty($this->execute($this->builder->one())->fetchColumn());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param bool $getSql
|
* @param array $data
|
||||||
* @return int|bool|string|null
|
* @return array|Command|bool|int|string
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public function delete(bool $getSql = false): int|bool|string|null
|
public function batchUpdate(array $data): Command|array|bool|int|string
|
||||||
{
|
{
|
||||||
$sql = $this->builder->delete();
|
$generate = $this->builder->update($data);
|
||||||
if ($getSql === false) {
|
if (is_bool($generate)) {
|
||||||
return $this->execute($sql)->delete();
|
return $generate;
|
||||||
}
|
}
|
||||||
return $sql;
|
return $this->execute(...$generate)->exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $data
|
||||||
|
* @return bool
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public function batchInsert(array $data): bool
|
||||||
|
{
|
||||||
|
[$sql, $params] = $this->builder->insert($data, TRUE);
|
||||||
|
|
||||||
|
|
||||||
|
return $this->execute($sql, $params)->exec();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param $filed
|
||||||
|
*
|
||||||
|
* @return null
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public function value($filed)
|
||||||
|
{
|
||||||
|
return $this->first()[$filed] ?? NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return bool
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public function exists(): bool
|
||||||
|
{
|
||||||
|
return !empty($this->execute($this->builder->one())->fetchColumn());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param bool $getSql
|
||||||
|
* @return int|bool|string|null
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public function delete(bool $getSql = FALSE): int|bool|string|null
|
||||||
|
{
|
||||||
|
$sql = $this->builder->delete();
|
||||||
|
if ($getSql === FALSE) {
|
||||||
|
return $this->execute($sql)->delete();
|
||||||
|
}
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+939
-938
File diff suppressed because it is too large
Load Diff
+6
-12
@@ -75,24 +75,18 @@ class Connection extends Component
|
|||||||
public Schema $_schema;
|
public Schema $_schema;
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var EventProvider
|
|
||||||
*/
|
|
||||||
#[Inject(EventProvider::class)]
|
|
||||||
public EventProvider $eventProvider;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* execute by __construct
|
* execute by __construct
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public function init()
|
public function init()
|
||||||
{
|
{
|
||||||
$this->eventProvider->on(OnWorkerStop::class, [$this, 'clear_connection'], 0);
|
$eventProvider = Kiri::getDi()->get(EventProvider::class);
|
||||||
$this->eventProvider->on(OnWorkerExit::class, [$this, 'clear_connection'], 0);
|
$eventProvider->on(OnWorkerStop::class, [$this, 'clear_connection'], 0);
|
||||||
$this->eventProvider->on(BeginTransaction::class, [$this, 'beginTransaction'], 0);
|
$eventProvider->on(OnWorkerExit::class, [$this, 'clear_connection'], 0);
|
||||||
$this->eventProvider->on(Rollback::class, [$this, 'rollback'], 0);
|
$eventProvider->on(BeginTransaction::class, [$this, 'beginTransaction'], 0);
|
||||||
$this->eventProvider->on(Commit::class, [$this, 'commit'], 0);
|
$eventProvider->on(Rollback::class, [$this, 'rollback'], 0);
|
||||||
|
$eventProvider->on(Commit::class, [$this, 'commit'], 0);
|
||||||
|
|
||||||
if (Db::transactionsActive()) {
|
if (Db::transactionsActive()) {
|
||||||
$this->beginTransaction();
|
$this->beginTransaction();
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ use Kiri\Application;
|
|||||||
use Kiri\Events\EventProvider;
|
use Kiri\Events\EventProvider;
|
||||||
use Kiri\Exception\ConfigException;
|
use Kiri\Exception\ConfigException;
|
||||||
use Kiri\Kiri;
|
use Kiri\Kiri;
|
||||||
use Note\Inject;
|
|
||||||
use Server\Events\OnWorkerStart;
|
use Server\Events\OnWorkerStart;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -24,13 +23,6 @@ class DatabasesProviders extends Providers
|
|||||||
private array $_pooLength = ['min' => 0, 'max' => 1];
|
private array $_pooLength = ['min' => 0, 'max' => 1];
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @var EventProvider
|
|
||||||
*/
|
|
||||||
#[Inject(EventProvider::class)]
|
|
||||||
public EventProvider $eventProvider;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param Application $application
|
* @param Application $application
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
|
|||||||
Reference in New Issue
Block a user