学说迁移:如何在插入后立即检索值

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

我有一个带有标准 up 方法的学说迁移课程,如下所示:

$this->addSql("INSERT INTO `mytable` (`name`) VALUES ('myvalue')");

        $res = $this->em->createQueryBuilder()
            ->select('a')
            ->from(MyEntityClass::class, 'a')
            ->where("a.name = :name")
            ->setParameter('name', 'myvalue')
            ->getQuery()
            ->getResult();
        $id = $res[0]->getId();

        //some other operation using $id...
        

运行此代码时出现错误:注意:未定义的偏移量:0

如果我手动检查数据库,则该值未插入。

但是,如果我使用选择查询注释掉该块,则该值会正确保存到表中。

在我看来,addSql 中的查询都是在脚本末尾执行的,有没有办法在将值保存到数据库后立即检索该值?

php symfony doctrine
3个回答
1
投票

这是因为

addSql
没有立即执行。 尝试执行以下操作:

$this->connection->executeUpdate("INSERT INTO `mytable` (`name`) VALUES ('myvalue')");
// and then
$lastId = $this->connection->fetchColumn('SELECT LAST_INSERT_ID()');

附注并且不要在迁移中使用查询生成器(这是一个不好的做法)。因为您的实体将来可能会更改(甚至删除)。


0
投票

addSql

的源代码中可以看到,它不执行任何语句,而是将其放入一个语句数组中,稍后执行。这就是为什么您无法直接访问 ID。

您可以通过子查询在任何其他语句中读取该 ID,例如:

$this->addSql('INSERT INTO otherTable(x,y) VALUES(1, (SELECT id from mytable WHERE `name` = "myvalue"))' );
    

0
投票
您可以将迁移分为两个不同的迁移。这样,在第二次迁移中,您将可以使用第一次迁移中生成的 id。

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