gpt4 book ai didi

php - 如何编写可以将数据重新分配到新表中的 Doctrine 迁移

转载 作者:IT王子 更新时间:2023-10-28 23:53:25 26 4
gpt4 key购买 nike

我有一个数据库(实际上是在 Symfony1 应用程序中使用 Propel 创建的)。我正在 Symfony2 和 Doctrine 中重新实现它,但我也想借此机会对数据库进行一些重构。

我定义了一组 Doctrine 实体并运行 doctrine:migrations:diff,这为我创建了一个基本的迁移以添加表、列和约束,并删除大量列。

但是,在删除这些列之前,我想将数据复制到一些新表中,然后将这些表中的新记录链接到第一个表中的新列。我不相信在纯 SQL 中可以做到这一点(通常,一个表的内容分布在三个或四个表中)。

This给了我一个提示,让我找到了this (我跳过了,因为我不知道“容器”可能与我的问题有什么关系)。

但是我在 Symfony 或 Doctrine 文档的任何地方都没有找到在迁移中实际移动数据的示例 - 在我看来这似乎是迁移的核心目的之一!

我可能可以使用上面那些链接中的提示,但我不确定如何继续。我没有(并且真的不想花时间创建,尽管我确定我可以)现有数据库模式的 Doctrine 实体:然后我可以使用 DQL 吗?我根本不知道。

所以两个问题:

  1. 有人可以给我一个在表之间移动数据的 Doctrine 迁移的例子吗?

  2. 或者,有人可以阐明 DQL 的语法对 Doctrine 中实体定义的依赖程度吗?我可以使用它来指定不在实体定义中的列吗?

最佳答案

好吧,我似乎从许多来源(包括 this )和反复试验中找到了它。

Cerad 的评论有点帮助,但主要是我通过使用 DBAL 层读取数据(我可以通过 $this->connection 获取)来完成它,以及ORM 来保存新数据(这需要 EntityManager,所以我不得不使用容器的技巧)。

我将所有代码放在 postUp() 中,包括生成的用于从表中删除列的代码。

我的代码示例:

use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

use PG\InventoryBundle\Entity\Item;
use PG\InventoryBundle\Entity\Address;
.
.
.

/**
* Auto-generated Migration: Please modify to your needs!
*/
class Version20140519211228 extends AbstractMigration implements ContainerAwareInterface
{
private $container;

public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}

public function up(Schema $schema)
{
.
.
.
}
}

public function postUp(Schema $schema)
{
$em = $this->container->get('doctrine.orm.entity_manager');
// ... update the entities
$query = "SELECT * FROM item";
$stmt = $this->connection->prepare($query);
$stmt->execute();

// We can't use Doctrine's ORM to fetch the item, because it has a load of extra fields
// that aren't in the entity definition.
while ($row = $stmt->fetch()) {
// But we will also get the entity, so that we can put addresses in it.
$id = $row['id'];
// And create new objects
$stock = new Stock();
.
.
.

$stock->setAssetNo($row['asset_no']);
$stock->setItemId($row['id']);
$em->persist($stock);

$em->flush();
}

// Now we can drop fields we don't need.
$this->connection->executeQuery("ALTER TABLE item DROP container_id");
$this->connection->executeQuery("ALTER TABLE item DROP location_id");
.
.
.

}

关于php - 如何编写可以将数据重新分配到新表中的 Doctrine 迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23747536/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com