2016-03-08 48 views
1

如何在不刷新其他实体的情况下只刷新一个实体?如何使用Doolrine冲洗一个实体而不冲洗另一个实体?

例如: 我有2个对象BStatus和B.它们通过OneToOne关系相关。 我想在B上做一些工作,但不保存到数据库中,但将工作状态保存在BStatus中,以便其他进程可以读取它。

class B { 

    /** 
    * @var int 
    * @ORM\Column(type="integer") 
    */ 
    public $i = 0; 

    /** 
    * @var BStatus 
    * @ORM\OneToOne(targetEntity="BStatus", inversedBy="b") 
    */ 
    public $status; 

    /** 
    * B constructor. 
    */ 
    public function __construct() { 
     $this->status = new BStatus($this); 
    } 

    public function count() { 
     return $this->i++; 
    } 
} 

class BStatus { 
    /** 
    * @var float 
    * @ORM\Column(type="float") 
    */ 
    public $progress = 0; 

    // <UPDATED> 
    /** 
    * @var B 
    * @ORM\OneToOne(targetEntity="B", mappedBy="status") 
    */ 
    public $progress = 0; 
    // </UPDATED> 

    /** 
    * BStatus constructor. 
    * @param B $b 
    */ 
    public function __construct(B $b) 
    { 
     $this->b = $b; 
    } 
} 


$b = // Load from DB 

$max = 100; 

for ($i = 0; $i < $max; $i++) { 
    $num = $b->count(); 
    $b->getStatus()->setProgress(($num + 1)/$max); 
    // Here I want to save the status 
} 

// Here I want to save $b 

更新 BSTATUS有指针B.

更新2

试图脱离B,冲洗和合并乙回来。

for ($i = 0; $i < $max; $i++) { 
    $num = $b->count(); 
    $status = $b->getStatus(); 
    $status->setProgress(($num + 1)/$max); 

    $em->detach($b); 
    $em->flush(); 
    $em->merge($b); 
} 

得到execption:

'Doctrine\ORM\ORMInvalidArgumentException' with message 'A new entity was found through the relationship BStatus#b' that was not configured to cascade persist operations for entity: local. 
To solve this issue: Either explicitly call EntityManager#persist() on this unknown entity or configure cascade persist this association in the mapping for example @ManyToOne(..,cascade={"persist"}).' 
+0

你可以使用destruct的具体? – Deep

+0

您没有cascade = {“persist”}关联。为什么简单的持续状态将不起作用?例如。 $ EM->坚持($ B->的getStatus()); 稍后调用。 – nutrija

+0

是的,但当我调用flush()保存之前所做的所有更改 –

回答

1
$em->flush($b); 

的单元分离对象将只刷新指定的实体。看起来不像在线文档显示这个功能,但实际代码中的高峰显示它至少是2.4以来的版本。

0

您可以从工作

$em->detach($instanceOfB) 
+0

我试过了。抛出异常: 异常'Doctrine \ ORM \ ORMInvalidArgumentException'带有消息'通过关系BStatus#b找到一个新实体,该关系未配置为级联实体:本地持久化操作。要解决这个问题:显式调用EntityManager#persist()这个未知实体或配置级联在映射中保持这个关联,例如@ManyToOne(..,cascade = {“persist”})。' –

+0

你说得对。如果我没有从BStatus指向B的指针,它就可以工作。但我需要从BStatus访问B.更新的问题。 –