yii2 中用 schema 类查表结构需调用 gettableschema('table_name') 获取 tableschema 对象,其 columns 属性包含字段信息;注意缓存、权限及 schema 配置问题。

怎么用 Yii2 的 Schema 类查表结构
Yii2 提供了 yii\db\Schema 类来统一访问数据库元信息,不依赖具体驱动的 SQL 查询。它比手写 SHOW COLUMNS 或 INFORMATION_SCHEMA 更安全、可移植。
核心方法是 getTableSchema(),传入表名(字符串)即可返回 TableSchema 对象:
$schema = \Yii::$app->db->getSchema();
$table = $schema->getTableSchema('user');
var_dump($table->columns); // 字段数组,键是字段名,值是 ColumnSchema 对象
- 表名必须是真实存在的,否则返回
null(不抛异常) - 如果表名带 schema(如
public.user),需确保数据库支持且配置了schemaMap - 字段类型、是否主键、是否允许 NULL、默认值等都封装在
ColumnSchema属性里,比如$column->isPrimaryKey、$column->defaultValue
为什么 getTableSchema() 有时返回空或报错
常见原因不是代码写错,而是缓存、权限或连接配置问题。
- 默认开启 Schema 缓存,若表结构刚改过但缓存没清,会读到旧结构 —— 清缓存用
\Yii::$app->db->getSchema()->refresh() - MySQL 用户没被授予
SELECT权限访问INFORMATION_SCHEMA.COLUMNS,会静默失败(返回null) - PostgreSQL 下若表不在
search_path里,又没用 schema 前缀,getTableSchema()找不到表 - SQLite 不支持 schema 名称,传入
main.user这类格式会失败
Yii3 怎么获取字段信息:从 Schema 到 Connection
Yii3 彻底重构了 DB 层,getTableSchema() 不再挂在 Connection 上,而是由 Schema 实例提供,且必须显式构造:
use Yiisoft\Db\Oracle\Schema; // 或 MysqlSchema、PgsqlSchema
$schema = new MysqlSchema($connection);
$table = $schema->getTable('user'); // 注意:方法名是 getTable(),不是 getTableSchema()
- 不再自动推导 driver 类型,必须手动 new 对应的
Schema子类 -
getTable()返回的是Table对象,字段列表在$table->getColumns()中,每个是Column实例 - 没有全局缓存机制,默认每次调用都查库,如需缓存得自己加
- 字段注释(COMMENT)在 Yii3 中可通过
$column->getComment()获取,Yii2 需要额外查INFORMATION_SCHEMA
绕过框架直接查 INFORMATION_SCHEMA 的适用场景
当 getTableSchema() 不够用 —— 比如要查索引、外键、约束、字段注释(MySQL 5.7+ / PG)、分区信息时,就得自己发 SQL。
- MySQL 示例:
SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'user' AND TABLE_SCHEMA = DATABASE() - PostgreSQL 示例:
SELECT column_name, data_type, is_nullable, column_default, col_description(oid, ordinal_position) FROM pg_catalog.pg_statio_all_tables AS st INNER JOIN pg_catalog.pg_description AS d ON d.objoid = st.relid CROSS JOIN LATERAL unnest(string_to_array(st.schemaname || '.' || st.relname, '.')) AS t(schema_name, table_name) WHERE t.table_name = 'user'(实际建议用更简洁的pg_columns视图) - 注意:这类 SQL 强耦合数据库类型,不能跨库复用;也绕过了 Yii 的连接/事务上下文,需手动管理
字段注释、生成列、存储引擎参数这些细节,框架抽象层通常只覆盖主流共性,真要深挖就得下到原生 schema 表 —— 这不是设计缺陷,是抽象必然的取舍。











