2010-01-19 54 views
1

我有一個保存到數據庫的項目集合,但我希望只有在不存在記錄的情況下才能插入記錄。學說:如何只保存數據庫中不存在的收集項目

我認爲最有效的方法是在保存之前過濾集合。教條可以自動執行嗎?

或者我應該得到集合中所有項目的所有id,然後在數據庫中查詢這些id列表中不存在的項目,然後在foreach中刪除我們不需要的所有集合項目,最後保存採集?

有什麼更好的方法建議?

回答

2

這是從Doctrine_Collection類保存功能

public function save(Doctrine_Connection $conn = null, $processDiff = true) 
    { 
     if ($conn == null) { 
      $conn = $this->_table->getConnection(); 
     } 

     try { 
      $conn->beginInternalTransaction(); 

      $conn->transaction->addCollection($this); 

      if ($processDiff) { 
       $this->processDiff(); 
      } 

      foreach ($this->getData() as $key => $record) { 
       $record->save($conn); 
      } 

      $conn->commit(); 
     } catch (Exception $e) { 
      $conn->rollback(); 
      throw $e; 
     } 

     return $this; 
    } 

我不知道你在哪裏得到您的收藏,或者如果你是手動構建它,但你可能想嘗試延長Doctrine_Collection類和超載像這樣的保存功能

<?php 

class My_Collection extends Doctrine Collection 
{ 

    public function save(Doctrine_Connection $conn = null, $processDiff = true, $createOnly = true) 
    { 
     if ($conn == null) { 
      $conn = $this->_table->getConnection(); 
     } 

     try { 
      $conn->beginInternalTransaction(); 

      $conn->transaction->addCollection($this); 

      if ($processDiff) { 
       $this->processDiff(); 
      } 

      foreach ($this->getData() as $key => $record) { 

       if($createOnly) 
       { 
        if ($record->exists()) 
        { 
         $record->save($conn); 
        } 
       }else{ 
        $record->save($conn); 
       } 
      } 

      $conn->commit(); 
     } catch (Exception $e) { 
      $conn->rollback(); 
      throw $e; 
     } 

     return $this; 
    } 

} 
0

我不知道什麼學說,但MySQL的更換查詢你想要做正是 - 更新現有行&如果沒有找到主鍵的比賽創造了新的行。

+0

謝謝。但我不想更新現有的行。如果存在,就不要做任何事情。另外,我正在使用PostgreSQL。 – takeshin 2010-01-29 08:41:20

+0

在Doctrine中,您可以使用replace()方法,但此方法刪除現有記錄,然後插入新的。 這意味着該行的ID不會被保留。 – takeshin 2010-03-17 00:11:16

+0

更合適的MYSQL操作將是INSERT IGNORE,而不是REPLACE。但它看起來像PostgreSQL不支持這些。 – Sam 2010-07-13 22:46:44