2023-06-24 18:37:52 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace ba;
|
|
|
|
|
2023-06-29 06:37:04 +00:00
|
|
|
use Throwable;
|
2023-06-24 18:37:52 +00:00
|
|
|
use think\facade\Db;
|
|
|
|
use think\facade\Config;
|
2023-06-29 06:37:04 +00:00
|
|
|
use think\migration\db\Table;
|
2023-06-24 18:37:52 +00:00
|
|
|
use Phinx\Db\Adapter\AdapterFactory;
|
|
|
|
use Phinx\Db\Adapter\AdapterInterface;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 数据表管理类
|
|
|
|
* @example TableManager::instance('test_table', ['comment' => '测试表'])->create();
|
|
|
|
*/
|
|
|
|
class TableManager
|
|
|
|
{
|
|
|
|
|
|
|
|
protected static ?AdapterInterface $adapter = null;
|
|
|
|
|
|
|
|
protected static ?AdapterInterface $wrapper = null;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 静态的 Phinx/Db/Table 实例列表
|
|
|
|
* @var array
|
|
|
|
* @uses Table 数组项
|
|
|
|
*/
|
|
|
|
protected static array $instances = [];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 返回一个 Phinx/Db/Table 实例 用于操作数据表
|
2023-06-29 06:37:04 +00:00
|
|
|
* @param string $table 表名
|
|
|
|
* @param array $options 传递给 Phinx/Db/Table 的 options
|
|
|
|
* @param bool $prefixWrapper 是否使用表前缀包装表名
|
2023-06-24 18:37:52 +00:00
|
|
|
* @return Table
|
|
|
|
*/
|
2023-06-29 06:37:04 +00:00
|
|
|
public static function instance(string $table, array $options = [], bool $prefixWrapper = true): Table
|
2023-06-24 18:37:52 +00:00
|
|
|
{
|
|
|
|
if (array_key_exists($table, self::$instances)) {
|
|
|
|
return self::$instances[$table];
|
|
|
|
}
|
|
|
|
|
2023-06-29 06:37:04 +00:00
|
|
|
self::adapter($prefixWrapper);
|
|
|
|
|
|
|
|
self::$instances[$table] = new Table($table, $options, $prefixWrapper ? self::$wrapper : self::$adapter);
|
|
|
|
return self::$instances[$table];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 返回一个 Phinx\Db\Adapter\AdapterFactory 实例
|
|
|
|
* @param bool $prefixWrapper 是否使用表前缀包装表名
|
|
|
|
* @return AdapterInterface
|
|
|
|
*/
|
|
|
|
public static function adapter(bool $prefixWrapper = true): AdapterInterface
|
|
|
|
{
|
2023-06-24 18:37:52 +00:00
|
|
|
if (is_null(self::$adapter)) {
|
|
|
|
$config = static::getDbConfig();
|
|
|
|
$factory = AdapterFactory::instance();
|
|
|
|
self::$adapter = $factory->getAdapter($config['adapter'], $config);
|
2023-06-29 06:37:04 +00:00
|
|
|
if ($prefixWrapper && is_null(self::$wrapper)) {
|
2023-06-24 18:37:52 +00:00
|
|
|
self::$wrapper = $factory->getWrapper('prefix', self::$adapter);
|
|
|
|
}
|
|
|
|
}
|
2023-06-29 06:37:04 +00:00
|
|
|
return $prefixWrapper ? self::$wrapper : self::$adapter;
|
|
|
|
}
|
2023-06-24 18:37:52 +00:00
|
|
|
|
2023-06-29 06:37:04 +00:00
|
|
|
/**
|
|
|
|
* 修改已有数据表的注释
|
|
|
|
* Phinx只在新增表时可以设置注释
|
|
|
|
* @param string $name
|
|
|
|
* @param string $comment
|
|
|
|
* @return bool
|
|
|
|
*/
|
|
|
|
public static function changeComment(string $name, string $comment): bool
|
|
|
|
{
|
|
|
|
$name = self::tableName($name);
|
|
|
|
try {
|
|
|
|
$sql = "ALTER TABLE `$name` COMMENT = '$comment'";
|
|
|
|
Db::execute($sql);
|
|
|
|
} catch (Throwable) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 数据表名
|
|
|
|
* @param string $table 表名,带不带前缀均可
|
|
|
|
* @param bool $fullName 是否返回带前缀的表名
|
|
|
|
* @return string 表名
|
|
|
|
*/
|
|
|
|
public static function tableName(string $table, bool $fullName = true): string
|
|
|
|
{
|
|
|
|
$tablePrefix = config('database.connections.mysql.prefix');
|
|
|
|
$pattern = '/^' . $tablePrefix . '/i';
|
|
|
|
return ($fullName ? $tablePrefix : '') . (preg_replace($pattern, '', $table));
|
2023-06-24 18:37:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 获取数据库配置
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
protected static function getDbConfig(): array
|
|
|
|
{
|
|
|
|
$default = Config::get('database.default');
|
|
|
|
$config = Config::get("database.connections.$default");
|
|
|
|
|
|
|
|
if ($config['deploy'] == 0) {
|
|
|
|
$dbConfig = [
|
|
|
|
'adapter' => $config['type'],
|
|
|
|
'connection' => Db::getPdo(),
|
|
|
|
'name' => $config['database'],
|
|
|
|
'table_prefix' => $config['prefix'],
|
|
|
|
];
|
|
|
|
} else {
|
|
|
|
$dbConfig = [
|
|
|
|
'adapter' => explode(',', $config['type'])[0],
|
|
|
|
'connection' => Db::getPdo(),
|
|
|
|
'name' => explode(',', $config['database'])[0],
|
|
|
|
'table_prefix' => explode(',', $config['prefix'])[0],
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
$table = Config::get('database.migration_table', 'migrations');
|
|
|
|
|
|
|
|
$dbConfig['default_migration_table'] = $dbConfig['table_prefix'] . $table;
|
|
|
|
|
|
|
|
return $dbConfig;
|
|
|
|
}
|
|
|
|
}
|