数据库架构管理#
在 XenForo 开发中,我们既可以通过传统 SQL 语句操作数据库,也可以使用更现代化的面向对象方式进行架构管理。以下是关键操作指南:
数据库适配器基础操作#
单行查询#
PHP
$db = \XF::db();
$user = $db->fetchRow('SELECT * FROM xf_user WHERE user_id = ?', 1);
$username = $user['username']; // 获取用户名
单值查询#
多行查询#
PHP
// 数字索引数组
$users = $db->fetchAll('SELECT * FROM xf_user LIMIT 10');
// 按user_id作为键名的关联数组
$users = $db->fetchAllKeyed('SELECT * FROM xf_user LIMIT 10', 'user_id');
单列查询#
无返回操作#
架构管理器高级用法#
表结构修改#
PHP
$sm->alterTable('xf_some_existing_table', function(\XF\Db\Schema\Alter $table) {
$table->addColumn('new_column', 'int')->setDefault(0); // 添加新列
$table->changeColumn('existing_col')->length(250); // 修改列长度
$table->addKey('index_name', ['column1', 'column2']); // 添加索引
});
新表创建#
PHP
$sm->createTable('xf_custom_table', function(\XF\Db\Schema\Create $table) {
$table->addColumn('post_id', 'int')->autoIncrement(); // 自增主键
$table->addColumn('content', 'text'); // 文本类型
$table->addColumn('author_id', 'int')->unsigned(false); // 允许负数
$table->addColumn('created_at', 'datetime')->nullable(); // 允许NULL
$table->addPrimaryKey('post_id'); // 显式声明主键
$table->addUniqueKey('content_hash', ['content(50)']); // 内容哈希唯一索引
$table->engine('MyISAM'); // 指定存储引擎
});
重要注意事项#
- 默认值规范:
- 所有字段必须显式设置默认值,可通过
->setDefault()
方法指定 -
允许NULL的字段需明确声明:
->nullable(true)
-
智能类型推断:
- 整数字段默认
unsigned
,需负数时使用->unsigned(false)
- 字段默认
NOT NULL
,需要空值时使用->nullable(true)
-
自动为自增字段设置主键
-
索引管理:
-
跨平台兼容:
- 使用SchemaManager可自动适配不同数据库平台
-
避免直接使用MySQL特定语法(如ENGINE=InnoDB)
-
调试技巧:
最佳实践建议#
- 优先使用SchemaManager进行架构变更,确保操作兼容性
- 对用户输入数据必须使用预处理语句(
?
占位符) - 复杂字段变更建议分步执行,避免丢失数据
- 定期备份数据库,特别是在执行ALTER操作前
- 使用
try/catch
块处理可能的数据操作异常
通过合理运用这些数据库管理技术,可以确保XenForo扩展开发中的数据操作既安全又高效,同时保持代码的可维护性。