سؤال

أريد نسخ سجل بكل علاقاته.

أنا أحاول:

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

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

$copy->save();

هذا الرمز لا يعمل ، لكنني أعتقد أنه في الطريق.

هل كانت مفيدة؟

المحلول

لم أتمكن من الحصول على وظيفة النسخ العميقة للعمل بشكل صحيح.

قمت يدويًا بترميز وظيفة نسخة عميقة لأحد طرازي مثل هذا

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();
}

نصائح أخرى

يمكنك أن تقرأ عن copy() هنا. يستغرق معلمة اختيارية $deep:

$ عميق
ما إذا كان لتكرار الكائنات التي تستهدف العلاقات

لذا

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

يجب القيام به.

آسف إذا كنت أقوم بإحياء هذا الموضوع ...

لقد وجدت نفسي بحثًا عن حل مؤخرًا حيث كنت بحاجة لنسخ سجل والاحتفاظ بمراجع الأصل. نسخة عميقة $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();
}

أتمنى أن يساعدك هذا :)

هذه هي الطريقة التي فعلت بها ، ولكن هناك حاجة إلى بعض الإصلاحات.

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

أنا أستخدم 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/ put $ this-> refreshReled () في مُنشئ جميع كائنات النموذج الخاصة بي. ب/ اكتب وظيفة تأخذ صفيفًا يصور الرسم البياني للكائن الذي أريد ملوثه. استدعاء الوظيفة المرتبطة بالمراسلة ($ ObjectGrapharray). مع الهيكل الصحيح للمصفوفة (مع وجود جميع أسماء العلاقات المناسبة في كل مستوى) ، يمكنني التحكم في العلاقات التي يتم ملؤها وأيها لا. استخدام واحد لهذا هو ملء الأطفال فقط ، وليس علاقات الوالدين. والآخر هو عندما يكون لدى ERD/Schema/ObjectGraph عنصر "مملوك" من قبل أكثر من كائن (العديد من الظروف الخاصة التي لدي) ، يمكنني التحكم ) محمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top