具有继承的Doctrine MongoDB不会持久化字段

时间:2015-06-29 09:13:44

标签: mongodb symfony inheritance doctrine-orm

为了更好地隔离问题,我试图简化我的代码,这里是:

此文档特征用作“通用”mongo文档。我基本上不想在每个文档中重写$ id和$ createdAt

/**
 * Class Document
 * @package TMPBundle\MongoDocument
 * @MongoDB\MappedSuperclass()
 */
trait Document {
    /**
     * @MongoDB\Id()
     */
    protected $id;
    /**
     * @MongoDB\Date()
     */
    protected $createdAt;
}

现在出现问题:

此类表示调查中的通用元素(问题)。我需要保留的唯一数据是在此类上(但将来我可能需要将数据添加到子类)

   /**
     * @MongoDB\MappedSuperclass()
     * @MongoDB\InheritanceType("SINGLE_COLLECTION")
     * @MongoDB\DiscriminatorField(fieldName="type")
     * @MongoDB\Collection(name="survey_elements")
     */
    abstract class AbstractSurveyType {
        use Document;

        /**
         * @MongoDB\String()
         */
        public $question;
        /**
         * @MongoDB\Collection()
         */
        public $value;
        /**
         * @MongoDB\Bool()
         */
        public $required;
        /**
         * @MongoDB\Bool()
         */
        public $hasRemark;
        /**
         * @MongoDB\String()
         */
        public $remarkQuestion;

    }

此类表示一个只有一个选项作为答案的问题(文本输入,文件输入等)。

/**
 * Class SingleSurveyType
 * @package TMPBundle\MongoDocument\Survey\SurveyTypes\SingleSurveyType
 * @MongoDB\Document()
 */
abstract class SingleSurveyType extends AbstractSurveyType{

    public function validate(){
        if (count($this->value) != 1){
            throw new InvalidSurveyElement("A SingleSurveyType cannot have more than one available value");
        }
    }
}

最后,我的问题还有一些额外的方法:

  /**
 * Class FileSurveyType
 * @package TMPBundle\MongoDocument\Survey\SurveyTypes\SingleSurveyType\Types
 * @MongoDB\Document()
 */
class FileSurveyType extends SingleSurveyType{

    protected function getFieldName()
    {
        return 'survey_question_file';
    }

    protected function getFieldType()
    {
        return 'file';
    }

}

在我的控制器中,当我这样做时:

   public function submitSurveyAction(Request $request){

        $file = new FileSurveyType();
        $file->setValue(["algo"]);
        $file->setQuestion("questao");

        $this->get('doctrine_mongodb.odm.document_manager')->persist($file);
        $this->get('doctrine_mongodb.odm.document_manager')->flush();
}

运行控制器之后操作所需的字段,但如果我将AbstractSurveyType中的属性设置为受保护,则字段不会保留。 此外,第一次运行'php app / console doctrine:mongodb:generate:documents'后(公开修改)我收到此错误:

'SingleSurveyType :: $问题的访问级别必须是公共的(如类AbstractSurveyType中)

我的初步问题:

  

我目前正在使用symfony2中的doctrine将数据保存到MongoDB   数据库。我的项目只是一个表格/调查创建系统。我有   几种问题类型,每种问题类型可以是单一类型   (文本,数字)或多种类型(选项,复选框等)。我试着   使用继承保存一些文档。这是我的一小部分   有:

trait Document {
/**
 * @MongoDB\Id()
 */
protected $id;
/**
 * @MongoDB\Date()
 */
protected $createdAt;
}
     

然后我在所有文件中都使用这个Document(所以我不必这样做   继续重复id属性和updatedAt)

 * @MongoDB\MappedSuperclass()
 * @MongoDB\DiscriminatorField("type")
 * @MongoDB\InheritanceType("SINGLE_COLLECTION")
 */

abstract class AbstractSurveyType {
    /**
     * @MongoDB\String()
     */
    protected $question;
}
     

在进入最后一堂课之前,我仍然只有一个   几种方法(单个和多个类型不处理   同样的方式)

/**
 * Class SingleSurveyType
 * @MongoDB\MappedSuperclass()
 * @MongoDB\InheritanceType("SINGLE_COLLECTION")
 */
abstract class SingleSurveyType extends AbstractSurveyType{
}
     

最后我有我的类型:

/**
 * @MongoDB\Document()
 * @package TMPBundle\MongoDocument\Survey\SurveyTypes\SingleSurveyType\Types
 */
class NumberSurveyType extends SingleSurveyType{
use Document;
}
     

我遇到的问题是当我将数据保存到数据库时   从Document,AbstracSurveyType和。继承的属性   SingleSurveyType不会被持久化。我的文档只有一个_id和   类型属性......这应该发生吗?

     

提前致谢:)

1 个答案:

答案 0 :(得分:1)

所以我终于能够解决这个问题...... 我没有使用MappedSuperclass而是将所有转录更改为Document。 希望它有所帮助!