2010-06-11 76 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(); 
}