为了更好地隔离问题,我试图简化我的代码,这里是:
此文档特征用作“通用”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和 类型属性......这应该发生吗?
提前致谢:)
答案 0 :(得分:1)
所以我终于能够解决这个问题......
我没有使用MappedSuperclass
而是将所有转录更改为Document
。
希望它有所帮助!