Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Symfony2、Doctrine2、EntityManager禁用最后的操作_Loops_Symfony_Doctrine Orm_Entitymanager - Fatal编程技术网

Loops Symfony2、Doctrine2、EntityManager禁用最后的操作

Loops Symfony2、Doctrine2、EntityManager禁用最后的操作,loops,symfony,doctrine-orm,entitymanager,Loops,Symfony,Doctrine Orm,Entitymanager,我们有 foreach ($rwst as $row) { $loopData = XmlFunctions::getXmlAttrAsArray($row); if (!$loopData) { return false; } $oCharacters = new XmlAccountCharacters(); $oCharacters ->setKeyID($this->keyID)

我们有

foreach ($rwst as $row)
{
    $loopData = XmlFunctions::getXmlAttrAsArray($row);
    if (!$loopData)
    {
        return false;
    }

    $oCharacters = new XmlAccountCharacters();
    $oCharacters
            ->setKeyID($this->keyID)
            ->setCharacterID($loopData['characterID'])
            ->setCharacterName($loopData['name'])
            ->setCorporationID($loopData['corporationID'])
            ->setCorporationName($loopData['corporationName']);

    $this->sEntityManager->persist($oCharacters);
}

$this->sEntityManager->flush();
关键是,我们什么时候会有错误

$loopData

我们将退出当前函数。但是图像foreach中的第二项将为false,因此第一个实体将持久化到EntityNamager。我怎样才能把它弄出来?因为next(即使在另一个service\controller中)->flush()将保存它,而我们不需要它。

您要的是显式事务。看一看这张照片。基本上,您的代码应该如下所示:

$this->sEntityManager->getConnection()->beginTransaction();
try {
    foreach ($rwst as $row) {
        $loopData = XmlFunctions::getXmlAttrAsArray($row);
        if (!$loopData) {
            throw new SomeException();
        }
        \\ the rest of your code
        $this->sEntityManager->persist($oCharacters);
    }
    $this->sEntityManager->flush();
    $this->sEntityManager->getConnection()->commit();
    return true;
} catch (SomeException $e) {
    $this->sEntityManager->getConnection()->rollback();
    $this->sEntityManager->close();
}
return false;

和往常一样,我能想象的是,任何一件事都要简单得多=\

if(!$loopData)
{
    $this->sEntityManager->clear()
    return false;
}
所有持久化的实体都将与条令分离,因此它们不会被插入\更新。 或针对单个实体

$this->sEntityManager->detach($entity);

要撤消持久化调用吗?如果您真的想保存,您应该只调用persist。不是,您自己试试,正如我所说的,无论从哪个控制器调用flush(),它都会插入到db我们的实体中。作为一个简单的示例,尝试在一个服务中持久化,然后在另一个服务中调用flush,从第一个服务调用实体,将被插入EAH这是所需的行为,因此如果在多个服务中编辑多个实体,则不必刷新和查询数据库。这有什么不对?若你们想要一个新的实体,并且一定要将它保存到数据库中,你们应该只调用persist。。。如果一个实体已经存在,因此由条令管理。。。您甚至可以使用持久调用和调用flush来保存实体。很好的示例,但它是事务,我不需要它,反正我找到了答案