使用assignIdentifier()更新对象而不是使用Doctrine插入

时间:2010-07-01 09:00:54

标签: php mysql doctrine

我对Doctrine很新,但据我了解,assignIdentifier()方法应该告诉Doctrine将相关行更新到数据库中而不是插入新的。

我有一个通过工作流构建的对象,因此标识符的idnull,直到我调用$object->save();插入它,这确实有效。< / p>

但是,如果我调用$object->assignIdentifier($newobj->id);然后调用$object->save();它不会执行任何操作 - 它不会插入新行并且不会更新旧行。

如果某个条件成立,我想从数据库中提取不同的记录并更新该行而不是插入新行。

我在这里理解错了吗?

一些代码来说明:

if($this->object->payments > 0) {           
    $older_payment = Doctrine_Query::create()
       ->from('OldPaid p')
       ->where('p.dealid = ?', $this->object->transid)
       ->fetchOne()
    ;

    $this->object->assignIdentifier($older_payment->id);
}

$this->object->save();

2 个答案:

答案 0 :(得分:2)

就像我知道的那样,save()不会在ID上自动增量更新现有记录。 我使用doctrine 1.2也有同样的问题。

我使用过这个想法,这是我发现的唯一一个工作:

$query = Doctrine_Query::create()->update('OldPaid');
$query->set($yourFieldname, '?', $yourValue);
$query->addwhere('p.dealid = ?', $this->object->transid);
$query->execute();

如果记录在DN中,并且主要密钥为dealid = $ this-&gt; object-&gt; transid,则Thiw将起作用。

问候语

答案 1 :(得分:0)

通常,如果您检索记录,则可以使用save()方法对其进行更新。 Doctrine认识到这一点(因为PK不会改变)并更新记录。

来自docs

  

您可以轻松更新对象   只需调用Doctrine_Record :: save()   方法

另一种方式可以是replace(),但我通常只使用save(),如果记录已经存在,则执行保存或更新。

据我所知,assignIdentifier()从未使用过它的描述,它只适用于通过ID检索对象,因此用这种方法更新某些东西是行不通的。