Skip to content

数据库架构管理#

在 XenForo 开发中,我们既可以通过传统 SQL 语句操作数据库,也可以使用更现代化的面向对象方式进行架构管理。以下是关键操作指南:

数据库适配器基础操作#

单行查询#

PHP
$db = \XF::db();
$user = $db->fetchRow('SELECT * FROM xf_user WHERE user_id = ?', 1);
$username = $user['username']; // 获取用户名

单值查询#

PHP
$username = $db->fetchOne('SELECT username FROM xf_user WHERE user_id = ?', 1);

多行查询#

PHP
// 数字索引数组
$users = $db->fetchAll('SELECT * FROM xf_user LIMIT 10');

// 按user_id作为键名的关联数组
$users = $db->fetchAllKeyed('SELECT * FROM xf_user LIMIT 10', 'user_id');

单列查询#

PHP
$usernames = $db->fetchAllColumn('SELECT username FROM xf_user LIMIT 10');

无返回操作#

PHP
$db->query('DELETE FROM xf_user WHERE user_id = ?', 1);

架构管理器高级用法#

表结构修改#

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');                              // 指定存储引擎
});

重要注意事项#

  1. 默认值规范
  2. 所有字段必须显式设置默认值,可通过->setDefault()方法指定
  3. 允许NULL的字段需明确声明:->nullable(true)

  4. 智能类型推断

  5. 整数字段默认unsigned,需负数时使用->unsigned(false)
  6. 字段默认NOT NULL,需要空值时使用->nullable(true)
  7. 自动为自增字段设置主键

  8. 索引管理

    PHP
    // 添加不同索引类型
    $table->addKey('idx_name', ['col1', 'col2(10)']);  // 普通索引
    $table->addUniqueKey('uniq_name', ['col3']);       // 唯一索引
    $table->addFulltextKey('ft_index', ['content']);    // 全文索引
    

  9. 跨平台兼容

  10. 使用SchemaManager可自动适配不同数据库平台
  11. 避免直接使用MySQL特定语法(如ENGINE=InnoDB)

  12. 调试技巧

    PHP
    // 查看生成的SQL语句
    $sm->logSchemaChanges(true);
    $sm->alterTable(...);
    $queries = $sm->getQueriesToRun();
    

最佳实践建议#

  • 优先使用SchemaManager进行架构变更,确保操作兼容性
  • 对用户输入数据必须使用预处理语句(?占位符)
  • 复杂字段变更建议分步执行,避免丢失数据
  • 定期备份数据库,特别是在执行ALTER操作前
  • 使用try/catch块处理可能的数据操作异常

通过合理运用这些数据库管理技术,可以确保XenForo扩展开发中的数据操作既安全又高效,同时保持代码的可维护性。