2010-03-01 61 views
3

我想用他所有的關係複製一條記錄。複製一個包含所有關係的Doctrine對象

我與努力:

$o = Doctrine::getTable('Table')->Find(x); 
$copy = $object->copy(); 
$relations = $o->getRelations(); 

foreach ($relations as $name => $relation) { 
    $copy->$relation = $object->$relation->copy(); 
} 

$copy->save(); 

此代碼不工作,但我認爲這是在路上。

回答

5

我永遠無法獲得深層複製功能以正確操作。

我手工編寫了深刻的複製功能爲我的車型之一這樣

public function copyAndSave() 
{ 
    $filters = array('id', 'created'); 

    $survey = $this->copy(); 

    $survey->Survey_Entries = new Doctrine_Collection("Survey_Model_Entry"); 
    $survey->Assignment_Assignments = new Doctrine_Collection("Assignment_Model_Assignment"); 
    $survey->Survey_Questions = new Doctrine_Collection("Survey_Model_Question"); 

    $survey->save(); 

    foreach ($this->Survey_Questions as $question) 
    { 
     $answers = $question->Survey_Answers; 
     $newQuestion = $question->copy(); 
     $newQuestion->survey_surveys_id = $survey->id; 
     $newQuestion->save(); 
     $newAnswers = new Doctrine_Collection("Survey_Model_Answer"); 

     foreach($answers as $answer) 
     { 
      $answer = $answer->copy(); 
      $answer->save(); 
      $answer->survey_questions_id = $newQuestion->id; 
      $newAnswers->add($answer); 
     } 
     $newQuestion->Survey_Answers = $newAnswers; 

     $survey->Survey_Questions->add($newQuestion); 
    } 
    return $survey->save(); 
} 
3

您可以閱讀關於copy()here。它帶有一個可選的參數$deep

$深
是否通過複製關係

所以

$copy = $object->copy(true); 

應該這樣做有針對性的對象。

+1

我認爲參數deesn't工作正常。 在我的模型中,我有2個行爲在嵌套集合中工作(I18n和Sluggable)。可能這是copy()方法失敗的原因。 – manolovn 2010-03-02 10:55:54

+6

我看了一下代碼 - 「deep」參數只在加載時複製引用。所以你必須在克隆之前訪問$ object的所有引用,或者找到一種方法來加載引用。 – chiborg 2011-01-03 21:13:33

0

這是我如何做,但需要一些修復。

$table = $entidade->getTable(); 
    $relations = $table->getRelations(); 
    foreach($relations as $relation => $data) { 
     try { 
      $entity->loadReference($relation); 
     } catch(Exception $e) { 
      die($e->getMessage()); 
     } 
    } 
2

很抱歉,如果我復活這個線程...

最近,我發現自己在尋找解決的地方,我需要複製的記錄,並保留了原有的引用。深拷貝$record->copy(true)複製引用,這對我沒有好處。這是我的解決方案:

$record = Doctrine_Core::getTable('Foo')->find(1); 
$copy = $record->copy(); 

foreach($record->getTable()->getRelations() as $relation) { 
    if ($relation instanceof Doctrine_Relation_Association) { 
     $ids = array(); 

     foreach ($relation->fetchRelatedFor($record) as $r) {  
      $ids[] = $r->getId(); 
     } 

     $copy->link($relation->getAlias(), $ids); 
    } 
} 

if ($copy->isValid()) { 
    $copy->save(); 
} 

希望這有助於:)

+1

謝謝!這只是工作 – flocki 2016-11-07 13:03:11

0

我使用Symfony1.4.1和使用原則1.2.1(我認爲)。

我一直在試圖做一個功能,做了上述所有我自己,當我發現一個已經存在。

在任何功能試試這個,看看結果:

$tmp=$this->toArray(TRUE); 
    var_dump($tmp); 
    $this->refreshRelated(); 
    $tmp=$this->toArray(); 
    var_dump($tmp); 
    $tmp=$this->toArray(TRUE); 
    var_dump($tmp); 
    exit(); 

我會嘗試兩種不同的東西:

A /把這個 - $> refreshRelated()爲所有的構造函數我的模型對象。 B編寫一個函數,該函數需要一個數組來描述我想要填充的對象圖。調用函數refereshRelatedGraph($ objectGraphArray)。使用數組的正確結構(在每個級別都有適當的關係名稱),我可以控制哪些關係得到填充,哪些不能。一個用途是僅填充兒童,而不是父母關係。另一個是當ERD/Schema/ObjectGraph有一個由多個對象「擁有」的元素(多對多,我有其他特殊情況)時,我可以控制關​​系的哪一方得到預先(非懶惰)加載。

相關問題