Doctrine 迁移:如何在插入后立即检索值
Doctrine migrations: how to retrieve value right after insert
我有一个学说迁移 class 使用标准的方法,像这样:
$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
如果我手动检查数据库,则没有插入值。
但是,如果我用 select 查询注释掉该块,该值将正确保存到 table。
在我看来,addSql 中的查询都是在脚本末尾执行的,有没有办法在保存到数据库后立即检索值?
正如你在source code of addSql
中看到的那样,它不执行任何语句,而是将其放入稍后执行的语句数组中。这就是为什么您无法直接访问 ID。
您可以通过子查询在任何其他语句中读取该 ID,例如:
$this->addSql('INSERT INTO otherTable(x,y)
VALUES(1, (SELECT id from mytable WHERE `name` = "myvalue"))'
);
这是因为addSql
没有立即执行。
尝试执行以下操作:
$this->connection->executeUpdate("INSERT INTO `mytable` (`name`) VALUES ('myvalue')");
// and then
$lastId = $this->connection->fetchColumn('SELECT LAST_INSERT_ID()');
P.S。并且不要在迁移中使用查询构建器(这是一种不好的做法)。因为您的实体将来可以更改(甚至删除)。
我有一个学说迁移 class 使用标准的方法,像这样:
$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
如果我手动检查数据库,则没有插入值。
但是,如果我用 select 查询注释掉该块,该值将正确保存到 table。
在我看来,addSql 中的查询都是在脚本末尾执行的,有没有办法在保存到数据库后立即检索值?
正如你在source code of addSql
中看到的那样,它不执行任何语句,而是将其放入稍后执行的语句数组中。这就是为什么您无法直接访问 ID。
您可以通过子查询在任何其他语句中读取该 ID,例如:
$this->addSql('INSERT INTO otherTable(x,y)
VALUES(1, (SELECT id from mytable WHERE `name` = "myvalue"))'
);
这是因为addSql
没有立即执行。
尝试执行以下操作:
$this->connection->executeUpdate("INSERT INTO `mytable` (`name`) VALUES ('myvalue')");
// and then
$lastId = $this->connection->fetchColumn('SELECT LAST_INSERT_ID()');
P.S。并且不要在迁移中使用查询构建器(这是一种不好的做法)。因为您的实体将来可以更改(甚至删除)。