mongodb的doctrine2 odm没有保存克隆的嵌套对象

时间:2012-08-10 16:17:28

标签: php mongodb doctrine-orm

所以我有一所学校,每所学校都有多个铃铛时间表,每个时间表都有详细信息:

school (document)
-- bell schedule (embedded document)
---- bell schedule details (embedded document)

当我克隆学校对象并打印学校时,它会返回克隆中的正确对象。但是,当我试图坚持学校时,它并没有正确保存细节。我需要做些什么来使其正常工作?我需要设置一个标志还是什么?

我试图做的是:

$school2 = clone $school1;
$dm->persist($school2);
$dm->flush();

---- classes ----

    /**
     * @MongoDB\Document(collection="schools")
     */
    class School
    {   
        /**
         * @MongoDB\EmbedMany
         */
        protected $bell_schedules = array();

        public function addBellSchedules(BellSchedule $bellSchedules)
        {
            $this->bell_schedules[] = $bellSchedules;
        }

        public function getBellSchedules()
        {
            return $this->bell_schedules;
        }

        public function setBellSchedules(\Doctrine\Common\Collections\ArrayCollection $bell_schedules)
        {
            $this->bell_schedules = $bell_schedules;
            return $this;
        }
    }


    /**
     * @MongoDB\EmbeddedDocument
     */
    class BellSchedule
    {
        /**
         * @MongoDB\EmbedMany
         */
        private $bell_schedule_details

        public function getBellScheduleDetails()
        {
            return $this->bell_schedule_details;
        }

        public function setBellScheduleDetails(\Doctrine\Common\Collections\ArrayCollection $bell_schedule_details)
        {
            $this->bell_schedule_details = $bell_schedule_details;
            return $this;
        }
    }

    /**
     * @MongoDB\EmbeddedDocument
     */
    class BellScheduleDetail
    {    
        private $period;
        private $label;
    }

1 个答案:

答案 0 :(得分:0)

您的@EmbedMany注释缺少targetDocument属性,该属性应与嵌入对象的类名对应。有关详细信息,请参阅annotation reference。此外,您缺少BellScheduleDetail类的字段映射。您可能希望将@String用于这些字段。

最后,我建议将EmbedMany和ReferenceMany字段初始化为ArrayCollection实例而不是空数组。这样,您始终可以期望该属性是Collection实现(ArrayCollection或PersistentCollection)。在您的情况下(使用[]运算符)可能没有太大区别,但如果您发现自己在属性上执行其他数组操作,它可以派上用场。