原则迁移:如何在插入后检索值



我有一个带有标准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

如果我手动检查db,值没有插入。

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

看着我在addSql查询都在脚本的末尾执行,是否有一种方法来检索值后,它保存在数据库上?

这是因为addSql没有立即执行。尝试执行以下操作:

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

注:不要在迁移中使用查询生成器(这是一种不好的做法)。因为你的实体可以在将来被改变(甚至被删除)。

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

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

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

最新更新