2010-06-11 18 views
4

我在处理当前项目时遇到过这种情况。我必须查看是否存在记录,如果不需要添加记录,如果存在,则需要更新。用Doctrine做这件事的标准方式是什么?学说 - 检查记录的最佳方法,然后更新或添加

我似乎在查询是否存在使用find *方法的记录。然后,如果这返回一个积极的结果(对象),我使用该对象来更新。否则,(找不到记录)我必须创建另一个对象并保存()。

由于某种原因,这似乎效率低下。有更好的方法还是我只是很奇怪? :)

$user = Doctrine_Core::getTable('Model_User')->findOneByEmail('[email protected]'); 
if (!$user) { 
    $user = new Model_User(); 
    $user->fromArray($values); // $values comes from form or wherever 
    $user->save(); 
} else { 
    $user->fromArray($values); 
    $user->save(); 
} 
+0

或者这个伟大的答案:http://stackoverflow.com/questions/14781688/doctrine-check-if-record-exists-based-on-field – Dung 2016-02-06 14:54:14

回答

4

这似乎是你要做的仅仅是它有点冗长:)这是非常“干净”,我认为:

$user = Doctrine_Core::getTable('Model_User')->findOneByEmail('[email protected]'); 
if (!$user) { 
    $user = new Model_User(); 
} 
$user->fromArray($values); // $values comes from form or wherever 
$user->save(); 

可能滚你自己:

class Model_UserTable extends Doctrine_Table { 
    ... 

    public findOrCreateOneByEmail($email) { 
     $user = $this->findOneByEmail($email); 
     if (is_null($user)) { 
      $user = new Model_User(); 
      $user->email = $email; 
     } 

     return $user; 
    } 
} 
+0

是的,我想你是对的。我喜欢第一种选择。不知道为什么我复制了save()代码。 – 2010-06-14 13:43:34

+0

我发现这种特殊的“实用”功能比干扰更有用:) – jensgram 2010-06-14 13:48:30

+0

@jensgram,为什么? – mattalxndr 2012-01-03 18:33:09

1

我已经在需要的sfDoctrineRecord类中编写了自己的方法。

public function saveOrUpdate(Doctrine_Connection $conn = null) { 
    $object = Doctrine_Core::getTable('TableAlias')->find(array($this->getKey1(), $this->getKey2())); 
    if (!is_object($object)) { 
     $object = $this; 
    }else{ 
     $object->setVar1($this->getVar1()); 
     $object->setVar2($this->getVar2()); 
     $object->setVar3($this->getVar3()); 
     $object->setVar4($this->getVar4()); 
    } 
    $object->save(); 
} 
相关问题