在 Symfony 5 迁移中访问实体管理器 class?
Access Entity Manager inside Symfony 5 migration class?
我在 table 中添加了一个新闻关系,在 postUp() 方法中我想更新我的所有线程。
如何访问迁移中的 EntityManager class 以获取我的所有线程、更新它们以及 persist/flush 我的修改?
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、存储库和任何你可能需要的东西。此控制台命令将执行一次以应用复杂的迁移,然后在下一个版本中停用。
我在 table 中添加了一个新闻关系,在 postUp() 方法中我想更新我的所有线程。
如何访问迁移中的 EntityManager class 以获取我的所有线程、更新它们以及 persist/flush 我的修改?
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、存储库和任何你可能需要的东西。此控制台命令将执行一次以应用复杂的迁移,然后在下一个版本中停用。