php 使用ORMExecutor::execute时出现异常“无活动事务”

t3irkdon  于 2022-12-17  发布在  PHP
关注(0)|答案(1)|浏览(114)

我从以下位置升级了旧项目:
PHP 5.6版本-〉8.0
原则/标准2.5.14 -〉2.13.4
条令/数据-固定装置1.2.2 -〉1.5.3
现在,以下代码将引发异常:
PDO例外:/var/www/html/src/供应商/教义/dbal/src/驱动程序/PDO/连接。php:120 /var/www/html/src/供应商/教义/dbal/src/连接。php:1481 /var/www/html/src/供应商/教义/orm/lib/教义/ORM/实体管理器。php:280

use Doctrine\Common\DataFixtures\Loader;
use Doctrine\Common\DataFixtures\Purger\ORMPurger;
use Doctrine\Common\DataFixtures\Executor\ORMExecutor;

$ormPurger = new ORMPurger($entityManager, $exclude);
$ormPurger->setPurgeMode(ORMPurger::PURGE_MODE_TRUNCATE);
$executor = new ORMExecutor($entityManager, $ormPurger);
$executor->execute($loader->getFixtures());

当\Doctrine\ORM\EntityManager::事务性调用时引发异常:
$this-〉连接-〉提交()
在文档中我读到:
不是所有的RDBMS都允许在事务中使用TRUNCATE语句,特别是当我们试图关闭一个已经隐式关闭的事务时,MySQL会产生臭名昭著的There is no active transaction消息。
doctrine-data-fixtures/en/latest/explanation/transactions-and-purging.html

----更新

我可以通过使用默认清除模式PURGE_MODE_DELETE而不是PURGE_MODE_TRUNCATE来修复错误。那么这是否意味着我不能在使用ORMExecutor::execute时使用TRUNCATE操作?

qlfbtfca

qlfbtfca1#

RDBMS(如MySQL)不允许在事务内使用TRUNCATE语句。
ORMExecutor::execute(array $fixture,$append = false)在事务中执行SQL操作,所以我们必须在事务之外执行TRUNCATE操作。

$purger = new ORMPurger($em, $exclude);
$purger->setPurgeMode(ORMPurger::PURGE_MODE_TRUNCATE);
$purger->purge();

$executor = new ORMExecutor($em);
$executor->execute($loader->getFixtures(), append: true);

要使用executor而不清除,我们可以将true传递给execute的第二个参数。

// Don't do this unless you want to purge all the tables 
// in the database prior to appending fixtures

$executor->execute($loader->getFixtures(), new ORMPurger());

相关问题