eee
This commit is contained in:
@@ -244,9 +244,26 @@ class SqlBuilder extends Component
|
||||
/**
|
||||
* @param string $table
|
||||
* @return string
|
||||
* @throws
|
||||
*/
|
||||
public function columns(string $table): string
|
||||
{
|
||||
$driver = $this->getDriver();
|
||||
if (in_array($driver, ['pgsql', 'postgresql'])) {
|
||||
// PostgreSQL 使用 information_schema
|
||||
$tableName = trim($table, '"`');
|
||||
return "SELECT
|
||||
column_name as Field,
|
||||
data_type as Type,
|
||||
is_nullable as Null,
|
||||
column_default as Default,
|
||||
'' as Extra,
|
||||
'' as Key
|
||||
FROM information_schema.columns
|
||||
WHERE table_name = '$tableName'
|
||||
ORDER BY ordinal_position";
|
||||
}
|
||||
// MySQL 使用 SHOW FULL FIELDS
|
||||
return 'SHOW FULL FIELDS FROM ' . $table;
|
||||
}
|
||||
|
||||
@@ -317,9 +334,19 @@ class SqlBuilder extends Component
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws
|
||||
*/
|
||||
private function makeLimit(): string
|
||||
{
|
||||
if ($this->query->getOffset() >= 0 && $this->query->getLimit() >= 1) {
|
||||
$driver = $this->getDriver();
|
||||
if (in_array($driver, ['pgsql', 'postgresql'])) {
|
||||
// PostgreSQL 使用 LIMIT ... OFFSET ... 语法
|
||||
return ' LIMIT ' . $this->query->getLimit() . ' OFFSET ' . $this->query->getOffset();
|
||||
}
|
||||
// MySQL 使用 LIMIT offset,limit 语法
|
||||
return ' LIMIT ' . $this->query->getOffset() . ',' . $this->query->getLimit();
|
||||
}
|
||||
return '';
|
||||
@@ -399,5 +426,36 @@ class SqlBuilder extends Component
|
||||
return $_array;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取数据库驱动类型
|
||||
* @return string
|
||||
* @throws
|
||||
*/
|
||||
private function getDriver(): string
|
||||
{
|
||||
try {
|
||||
// 尝试从 query 对象获取 connection
|
||||
if ($this->query instanceof ActiveQuery && $this->query->modelClass !== null) {
|
||||
if ($this->query->modelClass instanceof Model) {
|
||||
$connection = $this->query->modelClass->getConnection();
|
||||
if ($connection instanceof Connection) {
|
||||
return strtolower($connection->driver ?? 'mysql');
|
||||
}
|
||||
}
|
||||
}
|
||||
// 如果是 Db 查询,尝试获取默认 connection
|
||||
if (method_exists($this->query, 'getConnection')) {
|
||||
$connection = $this->query->getConnection();
|
||||
if ($connection instanceof Connection) {
|
||||
return strtolower($connection->driver ?? 'mysql');
|
||||
}
|
||||
}
|
||||
} catch (\Throwable $e) {
|
||||
// 忽略错误,返回默认值
|
||||
}
|
||||
// 默认返回 mysql
|
||||
return 'mysql';
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user