diff --git a/ActiveQuery.php b/ActiveQuery.php index 626ee74..ce30134 100644 --- a/ActiveQuery.php +++ b/ActiveQuery.php @@ -263,11 +263,7 @@ class ActiveQuery extends Component implements ISqlBuilder */ public function count(): int { - $data = $this->execute($this->builder->count(), $this->attributes)->one(); - if ($data && is_array($data)) { - return (int)array_shift($data); - } - return 0; + return $this->execute($this->builder->count(), $this->attributes)->one()['row_count'] ?? 0; } diff --git a/Connection.php b/Connection.php index daf1343..19c8d78 100644 --- a/Connection.php +++ b/Connection.php @@ -11,6 +11,7 @@ declare(strict_types=1); namespace Database; +use Closure; use Database\Affair\BeginTransaction; use Database\Affair\Commit; use Database\Affair\Rollback; @@ -96,9 +97,9 @@ class Connection extends Component /** * @param array $config - * @return \Closure + * @return Closure */ - public function gender(array $config): \Closure + public function gender(array $config): Closure { return static function () use ($config) { $options = [ diff --git a/DatabasesProviders.php b/DatabasesProviders.php index 82470e5..74d1573 100644 --- a/DatabasesProviders.php +++ b/DatabasesProviders.php @@ -32,7 +32,7 @@ class DatabasesProviders extends Providers return; } foreach ($databases as $key => $database) { - $application->set('db.' . $key, Kiri::createObject($this->_settings($database))); + $application->set($key, Kiri::createObject($this->_settings($database))); } } @@ -44,7 +44,7 @@ class DatabasesProviders extends Providers */ public function get($name): Connection { - return Kiri::service()->get('db.' . $name); + return Kiri::service()->get($name); } diff --git a/Db.php b/Db.php index 27c9692..e97a879 100644 --- a/Db.php +++ b/Db.php @@ -15,9 +15,11 @@ use Database\Affair\Commit; use Database\Affair\Rollback; use Database\Traits\QueryTrait; use Exception; +use Kiri; use Kiri\Exception\ConfigException; use Psr\Container\ContainerExceptionInterface; use Psr\Container\NotFoundExceptionInterface; +use Throwable; /** * Class Db @@ -25,345 +27,223 @@ use Psr\Container\NotFoundExceptionInterface; */ class Db implements ISqlBuilder { - use QueryTrait; + use QueryTrait; - private static bool $_inTransaction = false; - - /** - * @return void - */ - public static function beginTransaction(): void - { - fire(new BeginTransaction()); - } - - - /** - * @param Closure $closure - * @param mixed ...$params - * @return mixed - * @throws ContainerExceptionInterface - * @throws NotFoundExceptionInterface - * @throws Exception - */ - public static function Transaction(Closure $closure, ...$params): mixed - { - static::beginTransaction(); - try { - $result = call_user_func($closure, ...$params); - } catch (\Throwable $throwable) { - error($throwable); - $result = addError($throwable->getMessage(), 'mysql'); - } finally { - if ($result === false) { - static::rollback(); - } else { - static::commit(); - } - return $result; - } - } + private static bool $_inTransaction = false; /** - * @return void + * @var Connection|null */ - public static function commit(): void - { - fire(new Commit()); - } + private ?Connection $connection = null; /** - * @return void + * @param string|Connection $dbname + * @return Db + * @throws \Exception */ - public static function rollback(): void - { - fire(new Rollback()); - } - - - /** - * @param $table - * - * @return static - */ - public static function table($table): Db|static - { - $connection = new Db(); - $connection->from($table); - return $connection; - } - - - /** - * @param string $column - * @param string $alias - * @return string - */ - public static function any_value(string $column, string $alias = ''): string - { - if (empty($alias)) { - $alias = $column . '_any_value'; - } - return 'ANY_VALUE(' . $column . ') as ' . $alias; - } - - - /** - * @param string $column - * @return string - */ - public static function increment(string $column): string - { - return '+ ' . $column; - } - - - /** - * @param string $column - * @return string - */ - public static function decrement(string $column): string - { - return '- ' . $column; - } - - - /** - * @param Connection|null $connection - * @return mixed - * @throws Exception - */ - public function get(Connection $connection = NULL): mixed - { - $connection = static::getDefaultConnection($connection); - - return $connection->createCommand(SqlBuilder::builder($this)->one()) - ->all(); - } - - /** - * @param $column - * @return string - */ - public static function raw($column): string - { - return '`' . $column . '`'; - } - - /** - * @param Connection|null $connection - * @return array|bool|null - * @throws Exception - */ - public function find(Connection $connection = NULL): array|bool|null + public static function connect(string|Connection $dbname): Db { - $connection = static::getDefaultConnection($connection); + $db = new Db(); + if (is_string($dbname)) { + $dbname = Kiri::service()->get($dbname); + } + $db->connection = $dbname; + return $db; + } - return $connection->createCommand(SqlBuilder::builder($this)->all()) - ->one(); - } - - /** - * @param Connection|NULL $connection - * @return bool|int - * @throws Exception - */ - public function count(Connection $connection = NULL): bool|int - { - $connection = static::getDefaultConnection($connection); - - return $connection->createCommand(SqlBuilder::builder($this)->count()) - ->exec(); - } - - /** - * @param Connection|NULL $connection - * @return bool|int - * @throws Exception - */ - public function exists(Connection $connection = NULL): bool|int - { - $connection = static::getDefaultConnection($connection); - - return $connection->createCommand(SqlBuilder::builder($this)->one()) - ->fetchColumn(); - } - - /** - * @param string $sql - * @param array $attributes - * @param Connection|null $connection - * @return array|bool|int|string|null - * @throws Exception - */ - public static function findAllBySql(string $sql, array $attributes = [], Connection $connection = NULL): int|bool|array|string|null - { - $connection = static::getDefaultConnection($connection); - - return $connection->createCommand($sql, $attributes)->all(); - } - - /** - * @param string $sql - * @param array $attributes - * @param Connection|NULL $connection - * @return string|array|bool|int|null - * @throws Exception - */ - public static function findBySql(string $sql, array $attributes = [], Connection $connection = NULL): string|array|bool|int|null - { - $connection = static::getDefaultConnection($connection); - - return $connection->createCommand($sql, $attributes)->one(); - } - - /** - * @param string $field - * @return array|null - * @throws Exception - */ - public function values(string $field): ?array - { - $data = $this->get(); - if (empty($data) || empty($field)) { - return NULL; - } - $first = current($data); - if (!isset($first[$field])) { - return NULL; - } - return array_column($data, $field); - } - - /** - * @param $field - * @return mixed - * @throws Exception - */ - public function value($field): mixed - { - $data = $this->find(); - if (!empty($field) && isset($data[$field])) { - return $data[$field]; - } - return $data; - } - - /** - * @param Connection|null $connection - * @return bool|int - * @throws ConfigException - * @throws Exception - */ - public function delete(?Connection $connection = null): bool|int - { - $connection = static::getDefaultConnection($connection); - - return $connection->createCommand($connection->getBuild()->builder($this))->delete(); - } - - /** - * @param string $table - * @param null $connection - * @return bool|int - * @throws ConfigException - * @throws Exception - */ - public static function drop(string $table, $connection = null): bool|int - { - $connection = static::getDefaultConnection($connection); - - $sprint = sprintf('DROP TABLE' . ' `%s`.`%s`', $connection->database, $table); - return $connection->createCommand($sprint)->delete(); - } - - /** - * @param string $table - * @param null $connection - * @return bool|int - * @throws Exception - */ - public static function truncate(string $table, $connection = null): bool|int - { - $connection = static::getDefaultConnection($connection); - - $sprint = sprintf('TRUNCATE `%s`.`%s`', $connection->database, $table); - return $connection->createCommand($sprint)->exec(); - } - - /** - * @param string $table - * @param Connection|NULL $connection - * @return array|bool|null - * @throws ConfigException - * @throws Exception - */ - public static function showCreateSql(string $table, Connection $connection = NULL): array|bool|null - { - $connection = static::getDefaultConnection($connection); - - $sprint = sprintf('SHOW CREATE TABLE `%s`.`%s`', $connection->database, $table); - return $connection->createCommand($sprint)->one(); - } - - /** - * @param string $table - * @param Connection|NULL $connection - * @return array|bool|null - * @throws ConfigException - * @throws Exception - */ - public static function desc(string $table, Connection $connection = NULL): array|bool - { - $connection = static::getDefaultConnection($connection); - - $sprint = sprintf('SHOW FULL FIELDS FROM `%s`.`%s`', $connection->database, $table); - return $connection->createCommand($sprint)->all(); - } + /** + * @return void + * @throws Exception + */ + public static function beginTransaction(): void + { + fire(new BeginTransaction()); + } - /** - * @param string $table - * @param Connection|NULL $connection - * @return array|bool|null - * @throws Exception - */ - public static function show(string $table, Connection $connection = NULL): array|bool|null - { - if ($table == '') { - return null; - } - $connection = static::getDefaultConnection($connection); - - $table = [' const TABLE = \'select * from %s where REFERENCED_TABLE_NAME=%s\';']; - return $connection->createCommand((new Query()) - ->select('*') - ->from('INFORMATION_SCHEMA.KEY_COLUMN_USAGE') - ->where(['REFERENCED_TABLE_NAME' => $table]) - ->getSql())->one(); - } + /** + * @param Closure $closure + * @param mixed ...$params + * @return mixed + * @throws ContainerExceptionInterface + * @throws NotFoundExceptionInterface + * @throws Exception + */ + public static function Transaction(Closure $closure, ...$params): mixed + { + static::beginTransaction(); + try { + $result = call_user_func($closure, ...$params); + } catch (Throwable $throwable) { + error($throwable); + $result = addError($throwable->getMessage(), 'mysql'); + } finally { + if ($result === false) { + static::rollback(); + } else { + static::commit(); + } + return $result; + } + } - /** - * @param null|Connection $connection - * @param string $name - * @return mixed - * @throws Exception - */ - public static function getDefaultConnection(?Connection $connection, string $name = 'db'): Connection - { - if ($connection instanceof Connection) { - return $connection; - } - $databases = \config('databases.connections', []); - if (empty($databases) || !is_array($databases)) { - throw new Exception('Please configure the database link.'); - } - return \Kiri::service()->get($databases[$name]); - } + /** + * @return void + */ + public static function commit(): void + { + fire(new Commit()); + } + + + /** + * @return void + */ + public static function rollback(): void + { + fire(new Rollback()); + } + + + /** + * @param $table + * + * @return static + */ + public static function table($table): Db|static + { + $connection = new Db(); + $connection->connection = current(\config('databases.connections')); + $connection->from($table); + return $connection; + } + + + /** + * @param string $column + * @param string $alias + * @return string + */ + public static function any_value(string $column, string $alias = ''): string + { + if (empty($alias)) { + $alias = $column . '_any_value'; + } + return 'ANY_VALUE(' . $column . ') as ' . $alias; + } + + + /** + * @return array|bool + * @throws Exception + */ + public function get(): array|bool + { + return $this->connection->createCommand(SqlBuilder::builder($this)->all())->all(); + } + + /** + * @return array|bool|null + * @throws Exception + */ + public function first(): array|bool|null + { + return $this->connection->createCommand(SqlBuilder::builder($this)->all())->one(); + } + + /** + * @return bool|int + * @throws Exception + */ + public function count(): bool|int + { + return $this->connection->createCommand(SqlBuilder::builder($this)->count())->one()['row_count']; + } + + /** + * @return bool|int + * @throws Exception + */ + public function exists(): bool|int + { + return $this->connection->createCommand(SqlBuilder::builder($this)->one())->fetchColumn(); + } + + /** + * @param string $sql + * @param array $attributes + * @return array|bool|int|string|null + * @throws Exception + */ + public function query(string $sql, array $attributes = []): int|bool|array|string|null + { + return $this->connection->createCommand($sql, $attributes)->all(); + } + + /** + * @param string $sql + * @param array $attributes + * @return array|bool|int|string|null + * @throws Exception + */ + public function one(string $sql, array $attributes = []): int|bool|array|string|null + { + return $this->connection->createCommand($sql, $attributes)->one(); + } + + + /** + * @return bool|int + * @throws ConfigException + * @throws Exception + */ + public function delete(): bool|int + { + return $this->connection->createCommand(SqlBuilder::builder($this)->delete())->delete(); + } + + /** + * @param string $table + * @return array|bool|null + * @throws Exception + */ + public static function show(string $table): array|bool|null + { + if ($table == '') { + return null; + } + $connection = static::getDefaultConnection(); + + $table = [' const TABLE = \'select * from %s where REFERENCED_TABLE_NAME=%s\';']; + return $connection->createCommand((new Query()) + ->select('*') + ->from('INFORMATION_SCHEMA.KEY_COLUMN_USAGE') + ->where(['REFERENCED_TABLE_NAME' => $table]) + ->getSql())->one(); + } + + + /** + * @param null|Connection $connection + * @param string $name + * @return mixed + * @throws Exception + */ + public static function getDefaultConnection(?Connection $connection = null, string $name = 'db'): Connection + { + if ($connection instanceof Connection) { + return $connection; + } + $databases = \config('databases.connections', []); + if (empty($databases) || !is_array($databases)) { + throw new Exception('Please configure the database link.'); + } + return Kiri::service()->get($databases[$name]); + } } diff --git a/SqlBuilder.php b/SqlBuilder.php index d00e9b5..a2e0960 100644 --- a/SqlBuilder.php +++ b/SqlBuilder.php @@ -229,7 +229,7 @@ class SqlBuilder extends Component */ public function count(): string { - return $this->_selectPrefix(['COUNT(*)']) . $this->_prefix(); + return $this->_selectPrefix(['COUNT(*) as row_count']) . $this->_prefix(); }