This commit is contained in:
as2252258@163.com
2021-02-21 12:58:21 +08:00
parent 08ac31267b
commit 8a40bd7130
+274 -268
View File
@@ -6,10 +6,12 @@
* Time: 15:40 * Time: 15:40
*/ */
declare(strict_types=1); declare(strict_types=1);
namespace Database; namespace Database;
use Database\Traits\QueryTrait; use Database\Traits\QueryTrait;
use Exception; use Exception;
use HttpServer\Http\Context;
use Snowflake\Snowflake; use Snowflake\Snowflake;
/** /**
@@ -18,308 +20,312 @@ use Snowflake\Snowflake;
*/ */
class Db class Db
{ {
use QueryTrait; use QueryTrait;
private static bool $isActive = false; /**
* @return bool
*/
public static function transactionsActive(): bool
{
return Context::getContext('begin:transaction') === true;
}
/** /**
* @return bool * @throws Exception
*/ */
public static function transactionsActive(): bool public static function beginTransaction()
{ {
return static::$isActive; Context::setContext('begin:transaction', true);
} }
/** /**
* @throws Exception * @throws Exception
*/ */
public static function beginTransaction() public static function commit()
{ {
static::$isActive = true; if (!static::transactionsActive()) {
} return;
}
$event = Snowflake::app()->getEvent();
$event->trigger(Connection::TRANSACTION_COMMIT);
$event->offName(Connection::TRANSACTION_COMMIT);
Context::deleteId('begin:transaction');
}
/** /**
* @throws Exception * @throws Exception
*/ */
public static function commit() public static function rollback()
{ {
$event = Snowflake::app()->getEvent(); if (!static::transactionsActive()) {
$event->trigger(Connection::TRANSACTION_COMMIT); return;
$event->offName(Connection::TRANSACTION_COMMIT); }
static::$isActive = false; $event = Snowflake::app()->getEvent();
} $event->trigger(Connection::TRANSACTION_ROLLBACK);
$event->offName(Connection::TRANSACTION_ROLLBACK);
Context::deleteId('begin:transaction');
}
/** /**
* @throws Exception * @param $table
*/ *
public static function rollback() * @return static
{ */
$event = Snowflake::app()->getEvent(); public static function table($table): Db|static
$event->trigger(Connection::TRANSACTION_ROLLBACK); {
$event->offName(Connection::TRANSACTION_ROLLBACK); $db = new Db();
static::$isActive = false; $db->from($table);
} return $db;
}
/** /**
* @param $table * @param string $column
* * @param string $alias
* @return static * @return string
*/ */
public static function table($table): Db|static public static function any_value(string $column, string $alias = ''): string
{ {
$db = new Db(); if (empty($alias)) {
$db->from($table); $alias = $column . '_any_value';
return $db; }
} return 'ANY_VALUE(' . $column . ') as ' . $alias;
}
/** /**
* @param string $column * @param Connection|null $db
* @param string $alias * @return mixed
* @return string * @throws Exception
*/ */
public static function any_value(string $column, string $alias = ''): string public function get(Connection $db = NULL): mixed
{ {
if (empty($alias)) { if (empty($db)) {
$alias = $column . '_any_value'; $db = Snowflake::app()->database;
} }
return 'ANY_VALUE(' . $column . ') as ' . $alias; $query = $db->getSchema()->getQueryBuilder();
} return $db->createCommand($query->getQuery($this))
->all();
}
/** /**
* @param Connection|null $db * @param $column
* @return mixed * @return string
* @throws Exception */
*/ public static function raw($column): string
public function get(Connection $db = NULL): mixed {
{ return '`' . $column . '`';
if (empty($db)) { }
$db = Snowflake::app()->database;
}
$query = $db->getSchema()->getQueryBuilder();
return $db->createCommand($query->getQuery($this))
->all();
}
/** /**
* @param $column * @param Connection|null $db
* @return string * @return mixed
*/ * @throws Exception
public static function raw($column): string */
{ public function find(Connection $db = NULL): mixed
return '`' . $column . '`'; {
} if (empty($db)) {
$db = Snowflake::app()->database;
}
$query = $db->getSchema()->getQueryBuilder();
return $db->createCommand($query->getQuery($this))
->one();
}
/** /**
* @param Connection|null $db * @param Connection|NULL $db
* @return mixed * @return bool|int
* @throws Exception * @throws Exception
*/ */
public function find(Connection $db = NULL): mixed public function count(Connection $db = NULL): bool|int
{ {
if (empty($db)) { if (empty($db)) {
$db = Snowflake::app()->database; $db = Snowflake::app()->database;
} }
$query = $db->getSchema()->getQueryBuilder(); $query = $db->getSchema()->getQueryBuilder();
return $db->createCommand($query->getQuery($this)) return $db->createCommand($query->count($this))
->one(); ->rowCount();
} }
/** /**
* @param Connection|NULL $db * @param Connection|NULL $db
* @return bool|int * @return bool|int
* @throws Exception * @throws Exception
*/ */
public function count(Connection $db = NULL): bool|int public function exists(Connection $db = NULL): bool|int
{ {
if (empty($db)) { if (empty($db)) {
$db = Snowflake::app()->database; $db = Snowflake::app()->database;
} }
$query = $db->getSchema()->getQueryBuilder(); $query = $db->getSchema()->getQueryBuilder();
return $db->createCommand($query->count($this)) return $db->createCommand($query->getQuery($this))
->rowCount(); ->fetchColumn();
} }
/** /**
* @param Connection|NULL $db * @param string $sql
* @return bool|int * @param array $attributes
* @throws Exception * @param Connection|null $db
*/ * @return array|bool|int|string|null
public function exists(Connection $db = NULL): bool|int * @throws Exception
{ */
if (empty($db)) { public static function findAllBySql(string $sql, array $attributes = [], Connection $db = NULL): int|bool|array|string|null
$db = Snowflake::app()->database; {
} return $db->createCommand($sql, $attributes)->all();
$query = $db->getSchema()->getQueryBuilder(); }
return $db->createCommand($query->getQuery($this))
->fetchColumn();
}
/** /**
* @param string $sql * @param string $sql
* @param array $attributes * @param array $attributes
* @param Connection|null $db * @param Connection|NULL $db
* @return array|bool|int|string|null * @return array|mixed
* @throws Exception * @throws Exception
*/ */
public static function findAllBySql(string $sql, array $attributes = [], Connection $db = NULL): int|bool|array|string|null public static function findBySql(string $sql, array $attributes = [], Connection $db = NULL): mixed
{ {
return $db->createCommand($sql, $attributes)->all(); return $db->createCommand($sql, $attributes)->one();
} }
/** /**
* @param string $sql * @param string $field
* @param array $attributes * @return array|null
* @param Connection|NULL $db * @throws Exception
* @return array|mixed */
* @throws Exception public function values(string $field): ?array
*/ {
public static function findBySql(string $sql, array $attributes = [], Connection $db = NULL): mixed $data = $this->get();
{ if (empty($data) || empty($field)) {
return $db->createCommand($sql, $attributes)->one(); return NULL;
} }
$first = current($data);
if (!isset($first[$field])) {
return NULL;
}
return array_column($data, $field);
}
/** /**
* @param string $field * @param $field
* @return array|null * @return mixed
* @throws Exception * @throws Exception
*/ */
public function values(string $field): ?array public function value($field): mixed
{ {
$data = $this->get(); $data = $this->find();
if (empty($data) || empty($field)) { if (!empty($field) && isset($data[$field])) {
return NULL; return $data[$field];
} }
$first = current($data); return $data;
if (!isset($first[$field])) { }
return NULL;
}
return array_column($data, $field);
}
/** /**
* @param $field * @param null $db
* @return mixed * @return bool|int
* @throws Exception * @throws Exception
*/ */
public function value($field): mixed public function delete($db = null): bool|int
{ {
$data = $this->find(); if (empty($db)) {
if (!empty($field) && isset($data[$field])) { $db = Snowflake::app()->database;
return $data[$field]; }
}
return $data;
}
/** $query = $db->getBuild()->builder($this);
* @param null $db
* @return bool|int
* @throws Exception
*/
public function delete($db = null): bool|int
{
if (empty($db)) {
$db = Snowflake::app()->database;
}
$query = $db->getBuild()->builder($this); return $db->createCommand($query)->delete();
}
return $db->createCommand($query)->delete(); /**
} * @param $table
* @param null $db
* @return bool|int
* @throws Exception
*/
public static function drop($table, $db = null): bool|int
{
if (empty($db)) {
$db = Snowflake::app()->database;
}
return $db->createCommand('DROP TABLE ' . $table)->delete();
}
/** /**
* @param $table * @param $table
* @param null $db * @param null $db
* @return bool|int * @return bool|int
* @throws Exception * @throws Exception
*/ */
public static function drop($table, $db = null): bool|int public static function truncate($table, $db = null): bool|int
{ {
if (empty($db)) {
$db = Snowflake::app()->database;
}
return $db->createCommand('DROP TABLE ' . $table)->delete();
}
/** if (empty($db)) {
* @param $table $db = Snowflake::app()->database;
* @param null $db }
* @return bool|int
* @throws Exception
*/
public static function truncate($table, $db = null): bool|int
{
if (empty($db)) { return $db->createCommand('TRUNCATE ' . $table)->exec();
$db = Snowflake::app()->database; }
}
return $db->createCommand('TRUNCATE ' . $table)->exec(); /**
} * @param $table
* @param Connection|NULL $db
* @return mixed
* @throws Exception
*/
public static function showCreateSql($table, Connection $db = NULL): mixed
{
/** if (empty($db)) {
* @param $table $db = Snowflake::app()->database;
* @param Connection|NULL $db }
* @return mixed
* @throws Exception
*/
public static function showCreateSql($table, Connection $db = NULL): mixed
{
if (empty($db)) {
$db = Snowflake::app()->database;
}
if (empty($table)) { if (empty($table)) {
return null; return null;
} }
return $db->createCommand('SHOW CREATE TABLE ' . $table)->one(); return $db->createCommand('SHOW CREATE TABLE ' . $table)->one();
} }
/** /**
* @param $table * @param $table
* @param Connection|NULL $db * @param Connection|NULL $db
* @return bool|int|null * @return bool|int|null
* @throws Exception * @throws Exception
*/ */
public static function desc($table, Connection $db = NULL): bool|int|null public static function desc($table, Connection $db = NULL): bool|int|null
{ {
if (empty($db)) { if (empty($db)) {
$db = Snowflake::app()->database; $db = Snowflake::app()->database;
} }
if (empty($table)) { if (empty($table)) {
return null; return null;
} }
return $db->createCommand('SHOW FULL FIELDS FROM ' . $table)->all(); return $db->createCommand('SHOW FULL FIELDS FROM ' . $table)->all();
} }
/** /**
* @param string $table * @param string $table
* @param Connection|NULL $db * @param Connection|NULL $db
* @return mixed * @return mixed
* @throws Exception * @throws Exception
*/ */
public static function show(string $table, Connection $db = NULL): mixed public static function show(string $table, Connection $db = NULL): mixed
{ {
if (empty($table)) { if (empty($table)) {
return null; return null;
} }
if (empty($db)) { if (empty($db)) {
$db = Snowflake::app()->database; $db = Snowflake::app()->database;
} }
$table = [' const TABLE = \'select * from %s where REFERENCED_TABLE_NAME=%s\';']; $table = [' const TABLE = \'select * from %s where REFERENCED_TABLE_NAME=%s\';'];
return $db->createCommand((new Sql()) return $db->createCommand((new Sql())
->select('*') ->select('*')
->from('INFORMATION_SCHEMA.KEY_COLUMN_USAGE') ->from('INFORMATION_SCHEMA.KEY_COLUMN_USAGE')
->where(['REFERENCED_TABLE_NAME' => $table]) ->where(['REFERENCED_TABLE_NAME' => $table])
->getSql())->one(); ->getSql())->one();
} }
} }