2010-03-01 38 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有一个由多个对象“拥有”的元素(多对多,我有其他特殊情况)时,我可以控制关​​系的哪一方得到预先(非懒惰)加载。

相关问题