update:优化代码生成

This commit is contained in:
JaguarJack
2021-03-14 07:41:15 +08:00
parent 7b7f13536f
commit 822ff3874a
15 changed files with 879 additions and 391 deletions

View File

@@ -0,0 +1,272 @@
<?php
// +----------------------------------------------------------------------
// +----------------------------------------------------------------------
// | CatchAdmin [Just Like ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2020 http://catchadmin.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://github.com/yanwenwu/catch-admin/blob/master/LICENSE.txt )
// +----------------------------------------------------------------------
// | Author: JaguarJack [ njphper@gmail.com ]
// +----------------------------------------------------------------------
namespace catcher\generate\support;
use catcher\exceptions\FailedException;
use catcher\Utils;
use Phinx\Db\Adapter\AdapterFactory;
use think\facade\Db;
use think\migration\db\Column;
class Table
{
protected static $adapter = null;
protected static $table = null;
protected static $tableName = null;
public function __construct(string $tableName)
{
self::$tableName = $tableName;
}
/**
* 获取 table 对象
*
* @time 2021年03月04日
* @return \think\migration\db\Table
*/
protected static function getTable(): \think\migration\db\Table
{
if (self::$table) {
return self::$table;
}
return (new \think\migration\db\Table(Utils::tableWithPrefix(self::$tableName)))->setAdapter(self::getAdapter());
}
/**
* create table
*
* @time 2021年03月04日
* @param string $primaryKey
* @param string $engine
* @param string $comment
* @return bool
*/
public static function create(string $primaryKey, string $engine, string $comment): bool
{
self::getTable()
->setId($primaryKey)
->setPrimaryKey($primaryKey)
->setEngine($engine)
->setComment($comment)
->setCollation('utf8mb4_general_ci')
->create();
return self::exist();
}
/**
* 表是否存在
*
* @time 2021年03月04日
* @return bool
*/
public static function exist(): bool
{
return self::getTable()->exists();
}
/**
* 删除表
*
* @time 2021年03月04日
* @return bool
*/
public static function drop(): bool
{
if (!self::exist()) {
throw new FailedException(sprintf('table [%s] not exist, drop failed', self::$tableName));
}
self::getTable()->drop();
return self::exist();
}
/**
* 新增 column
*
* @time 2021年03月04日
* @param mixed $column
* @return bool
*/
public static function addColumn($column): bool
{
if ($column instanceof \Closure) {
$column = $column();
}
if (!$column instanceof Column) {
throw new FailedException('Column Must Be "think\migration\db\Column');
}
// 新增字段
self::getTable()
->addColumn($column)
->update();
return self::hasColumn($column->getName());
}
/**
* 是否存在 column
*
* @time 2021年03月08日
* @param string $column
* @return bool
*/
public static function hasColumn(string $column): bool
{
return self::getTable()->hasColumn($column);
}
/**
* 获取表结构信息
*
* @time 2021年03月05日
* @return array
*/
public static function columns(): array
{
return array_values(Db::getFields(Utils::tableWithPrefix(self::$tableName)));
}
/**
* 删除 column
*
* @time 2021年03月04日
* @param string $column
* @return bool
*/
public static function dropColumn(string $column): bool
{
self::getTable()->removeColumn($column)->update();
if (self::getTable()->hasColumn($column)) {
throw new FailedException('remove column ['.$column.'] failed');
}
return true;
}
/**
* 唯一索引
*
* @time 2021年03月13日
* @param string| array $columns
* @return void
*/
public static function addUniqueIndex($columns)
{
self::getTable()->addIndex($columns, [
'unique' => true, 'name' => self::$tableName . '_' . (is_string($columns) ? $columns : implode('_', $columns))
])->update();
}
/**
* 添加普通索引
*
* @time 2021年03月13日
* @param string| array $columns
* @return void
*/
public static function addIndex($columns)
{
self::getTable()->addIndex($columns, [
'name' => self::$tableName . '_' . (is_string($columns) ? $columns : implode('_', $columns))
])->update();
}
/**
* 添加全文索引
*
* @time 2021年03月13日
* @param string| array $columns
* @return void
*/
public static function addFulltextIndex($columns)
{
self::getTable()->addIndex($columns, [
'type' => 'fulltext',
'name' => self::$tableName . '_' . (is_string($columns) ? $columns : implode('_', $columns))
])->update();
}
/**
* 获取适配器
*
* @time 2021年03月04日
* @return mixed
*/
public static function getAdapter()
{
if (self::$adapter) {
return self::$adapter;
}
$options = self::getDbConfig();
$adapter = AdapterFactory::instance()->getAdapter($options['adapter'], $options);
if ($adapter->hasOption('table_prefix') || $adapter->hasOption('table_suffix')) {
$adapter = AdapterFactory::instance()->getWrapper('prefix', $adapter);
}
self::$adapter = $adapter;
return $adapter;
}
/**
* 获取数据库配置
* @return array
*/
protected static function getDbConfig(): array
{
$default = app()->config->get('database.default');
$config = app()->config->get("database.connections.{$default}");
if (0 == $config['deploy']) {
$dbConfig = [
'adapter' => $config['type'],
'host' => $config['hostname'],
'name' => $config['database'],
'user' => $config['username'],
'pass' => $config['password'],
'port' => $config['hostport'],
'charset' => $config['charset'],
'table_prefix' => $config['prefix'],
];
} else {
$dbConfig = [
'adapter' => explode(',', $config['type'])[0],
'host' => explode(',', $config['hostname'])[0],
'name' => explode(',', $config['database'])[0],
'user' => explode(',', $config['username'])[0],
'pass' => explode(',', $config['password'])[0],
'port' => explode(',', $config['hostport'])[0],
'charset' => explode(',', $config['charset'])[0],
'table_prefix' => explode(',', $config['prefix'])[0],
];
}
$table = app()->config->get('database.migration_table', 'migrations');
$dbConfig['default_migration_table'] = $dbConfig['table_prefix'] . $table;
return $dbConfig;
}
}

View File

@@ -0,0 +1,376 @@
<?php
namespace catcher\generate\support;
use catcher\Utils;
use Phinx\Db\Adapter\AdapterInterface;
use Phinx\Db\Adapter\MysqlAdapter;
use think\migration\db\Column;
class TableColumn
{
/**
* tinyint
*
* @time 2021年03月13日
* @param string $name
* @param int $length
* @return Column
*/
public function tinyint(string $name, int $length): Column
{
return Column::tinyInteger($name);
}
/**
* boolean
*
* @time 2021年03月13日
* @param string $name
* @param int $length
* @return Column
*/
public function boolean(string $name, int $length): Column
{
return Column::boolean($name);
}
/**
* smallint
*
* @time 2021年03月13日
* @param string $name
* @param int $length
* @return Column
*/
public function smallint(string $name, int $length): Column
{
return Column::smallInteger($name);
}
/**
* int
*
* @time 2021年03月13日
* @param string $name
* @param int $length
* @return Column
*/
public function int(string $name, int $length): Column
{
return Column::integer($name);
}
/**
* mediumint
*
* @time 2021年03月13日
* @param string $name
* @param int $length
* @return Column
*/
public function mediumint(string $name, int $length): Column
{
return Column::mediumInteger($name);
}
/**
* bigint
*
* @time 2021年03月13日
* @param string $name
* @param int $length
* @return Column
*/
public function bigint(string $name, int $length): Column
{
return Column::bigInteger($name);
}
/**
* 浮点数
*
* @time 2021年03月08日
* @param string $name
* @param int $length
* @return Column
*/
public function float(string $name, int $length): Column
{
return Column::float($name);
}
/**
* 浮点数
*
* @time 2021年03月08日
* @param string $name
* @param int $precision
* @param int $scale
* @return Column
*/
public function decimal(string $name, $precision = 8, $scale = 2): Column
{
return Column::decimal($name, $precision, $scale);
}
/**
* string 类型
*
* @time 2021年03月08日
* @param string $name
* @param int $length
* @return Column
*/
public function varchar(string $name, int $length): Column
{
return Column::string($name, $length);
}
/**
* char
*
* @time 2021年03月13日
* @param string $name
* @param int $length
* @return Column
*/
public function char(string $name, int $length): Column
{
return Column::char($name, $length);
}
/**
* 普通文本
*
* @time 2021年03月08日
* @param string $name
* @param int $length
* @return Column
*/
public function text(string $name, int $length): Column
{
return Column::text($name);
}
/**
* 小文本
*
* @time 2021年03月13日
* @param string $name
* @param int $length
* @return Column
*/
public function tinytext(string $name, int $length): Column
{
return Column::make($name, AdapterInterface::PHINX_TYPE_TEXT, ['length' => MysqlAdapter::TEXT_TINY]);
}
/**
* 中长文本
*
* @time 2021年03月13日
* @param string $name
* @param int $length
* @return Column
*/
public function mediumtext(string $name, int $length): Column
{
return Column::mediumText($name);
}
/**
* 超大文本
*
* @time 2021年03月08日
* @param string $name
* @param int $length
* @return Column
*/
public function longtext(string $name, int $length): Column
{
return Column::longText($name);
}
/**
* binary
*
* @time 2021年03月13日
* @param string $name
* @param int $length
* @return Column
*/
public function binary(string $name, int $length): Column
{
return Column::binary($name);
}
/**
* varbinary
*
* @time 2021年03月13日
* @param string $name
* @param int $length
* @return Column
*/
public function varbinary(string $name, int $length): Column
{
return Column::make($name, AdapterInterface::PHINX_TYPE_VARBINARY);
}
/**
* tinyblob
*
* @time 2021年03月13日
* @param string $name
* @param int $length
* @return Column
*/
public function tinyblob(string $name, int $length): Column
{
return Column::make($name, AdapterInterface::PHINX_TYPE_BLOB, ['length' => MysqlAdapter::BLOB_TINY]);
}
/**
* blob
*
* @time 2021年03月13日
* @param string $name
* @param int $length
* @return Column
*/
public function blob(string $name, int $length): Column
{
return Column::make($name, AdapterInterface::PHINX_TYPE_BLOB, ['length' => MysqlAdapter::BLOB_REGULAR]);
}
/**
* mediumblob
*
* @time 2021年03月13日
* @param string $name
* @param int $length
* @return Column
*/
public function mediumblob(string $name, int $length): Column
{
return Column::make($name, AdapterInterface::PHINX_TYPE_BLOB, ['length' => MysqlAdapter::BLOB_MEDIUM]);
}
/**
* longblob
*
* @time 2021年03月13日
* @param string $name
* @param int $length
* @return Column
*/
public function longblob(string $name, int $length): Column
{
return Column::make($name, AdapterInterface::PHINX_TYPE_BLOB, ['length' => MysqlAdapter::BLOB_LONG]);
}
/**
* 时间类型
*
* @time 2021年03月08日
* @param string $name
* @param int $length
* @return Column
*/
public function date(string $name, int $length): Column
{
return Column::date($name);
}
/**
* 日期时间
*
* @time 2021年03月08日
* @param string $name
* @param int $length
* @return Column
*/
public function datetime(string $name, int $length): Column
{
return Column::dateTime($name)->setOptions(['default' => 'CURRENT_TIMESTAMP']);
}
/**
* 实践格式
*
* @time 2021年03月08日
* @param string $name
* @param int $length
* @return Column
*/
public function time(string $name, int $length): Column
{
return Column::time($name);
}
/**
* 时间戳
*
* @time 2021年03月08日
* @param string $name
* @param int $length
* @return Column
*/
public function timestamp(string $name, int $length): Column
{
return Column::timestamp($name)->setOptions(['default' => 'CURRENT_TIMESTAMP']);
}
/**
* enum 类型
*
* @time 2021年03月13日
* @param $name
* @param $values
* @return Column
*/
public function enum(string $name, $values): Column
{
return Column::enum($name, is_string($values) ? Utils::stringToArrayBy($values) : $values);
}
/**
* set 类型
*
* @time 2021年03月13日
* @param string $name
* @param $values
* @return Column
*/
public function set(string $name, $values): Column
{
$values = is_string($values) ? Utils::stringToArrayBy($values) : $values;
return Column::make($name, AdapterInterface::PHINX_TYPE_SET, compact('values'));
}
/**
* json 穿
*
* @time 2021年03月13日
* @param string $name
* @return Column
*/
public function json(string $name): Column
{
return Column::json($name);
}
/**
* uuid
*
* @time 2021年03月13日
* @param string $name
* @return Column
*/
public function uuid(string $name): Column
{
return Column::uuid($name);
}
}