Symfony4中使用Gedmo/Loggable时ext_log_entries表缺失,求迁移方案
解决Symfony 4中Gedmo/Loggable的ext_log_entries表缺失问题
遇到这个问题很常见,通常是因为Doctrine还没识别到Gedmo的LogEntry实体,或者还没生成对应的数据库迁移文件。下面给你几个可行的解决方案:
方法一:用Doctrine Migrations自动生成迁移文件
这是最推荐的方式,尤其是在开发和生产环境都适用:
- 先确认你的Gedmo配置没问题:
- 如果你用的是
StofDoctrineExtensionsBundle(大部分Symfony项目都会用这个来集成Gedmo扩展),确保bundle已经在config/bundles.php里注册,并且在config/packages/stof_doctrine_extensions.yaml中开启了loggable功能:stof_doctrine_extensions: default_locale: en_US orm: default: loggable: true - 如果是手动集成Gedmo,需要在
config/packages/doctrine.yaml的ORM映射里添加Gedmo Loggable实体的路径:doctrine: orm: mappings: GedmoLoggable: type: annotation prefix: Gedmo\Loggable\Entity dir: "%kernel.project_dir%/vendor/gedmo/doctrine-extensions/src/Loggable/Entity" alias: GedmoLoggable is_bundle: false
- 如果你用的是
- 生成迁移文件:
在项目根目录运行命令:
Doctrine会自动检测到php bin/console make:migrationLogEntry实体(对应ext_log_entries表)与当前数据库的差异,生成包含建表语句的迁移文件。 - 执行迁移:
运行命令将表创建到数据库中:php bin/console doctrine:migrations:migrate
方法二:手动创建迁移文件
这是不推荐,但应急可用的方式:
- 运行命令创建空白迁移:
php bin/console make:migration --empty - 在生成的迁移文件的
up方法中添加建表语句(适配你的数据库类型,这里以MySQL为例):public function up(Schema $schema) : void { $this->addSql('CREATE TABLE ext_log_entries ( id INT AUTO_INCREMENT NOT NULL, action VARCHAR(8) NOT NULL, logged_at DATETIME NOT NULL, object_id VARCHAR(64) DEFAULT NULL, object_class VARCHAR(255) NOT NULL, version INT NOT NULL, username VARCHAR(255) DEFAULT NULL, data LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\', PRIMARY KEY(id) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB'); $this->addSql('CREATE INDEX log_class_lookup_idx ON ext_log_entries (object_class)'); $this->addSql('CREATE INDEX log_date_lookup_idx ON ext_log_entries (logged_at)'); $this->addSql('CREATE INDEX log_user_lookup_idx ON ext_log_entries (username)'); $this->addSql('CREATE INDEX log_version_lookup_idx ON ext_log_entries (object_id, object_class, version)'); } - 执行迁移命令完成建表。
注意事项
- 执行迁移前,请确保你的数据库连接配置正确,并且有足够的权限创建表。
- 如果之前尝试过错误的迁移,可以用
php bin/console doctrine:migrations:rollback回滚后再重新操作。 - 生产环境下,尽量不要用
php bin/console doctrine:schema:update --force直接更新表结构,迁移文件的方式更可控且便于追踪变更。
内容的提问来源于stack exchange,提问作者Thibault Dumas
相关产品推荐
相关产品推荐

