在 Symfony 5 迁移类中访问实体管理器?

问题描述 投票:0回答:1

我在表中添加了新闻关系,并且在 postUp() 方法中我想更新所有线程。

如何访问迁移类中的 EntityManager 以获取所有线程、更新它们并保留/刷新我的修改?

php symfony doctrine migration entitymanager
1个回答
8
投票

Doctrine 迁移工具旨在为您执行 SQL 查询以修改您的数据库架构。它与持久对象无关,因为它在数据库级别而不是 ORM 级别上操作。您可以编写 SQL 查询来更新相关的数据库记录。此外,您还可以在迁移脚本中使用数据库连接,以便从数据库中获取所需的数据。这是一个简单的示例,可以为您提供一个起点。

foreach ($this->connection->fetchAll('SELECT id FROM table') as $id) {
    $ids = $this->connection->fetchAll(
        'SELECT some_id FROM another_table WHERE whatever_id = :whateverId GROUP BY some_id',
        [
            'whateverId' => $id['id']
        ]
    );

    $this->addSql(
        'UPDATE table_to_update SET some_field = :someField WHERE id = :some_id',
        [
            'someField' => implode(
                ',',
                array_map(
                    static function (array $data) {
                        return $data['some_id'];
                    },
                    $ids
                )
            ),
            'some_id' => $id['id']
        ]
    );
}

作为这种情况的替代方案,如果您在不访问持久对象的情况下绝对无法解决问题(例如,如果您需要在迁移中应用一些业务逻辑,或者迁移逻辑超出了简单的架构更改),那么最好编写一个Symfony Console Command 并注入 EntityManager、存储库以及您可能需要的任何内容。此控制台命令将执行一次以应用复杂的迁移,然后在下一版本中停用。

© www.soinside.com 2019 - 2024. All rights reserved.