Doctrine ODM embedOne different document

来源:互联网 发布:数据分析面试题 编辑:程序博客网 时间:2024/05/21 00:00

在使用doctrine\odm 的embedOne标注时,要定义targetDocument,在此之前我在使用此标注时都是只嵌入一种类型的嵌入文档,在保存不同文档时,是将此属性定义为hash类

/*** @ODM\Hash*/protected $desc;

这样使用的问题是desc里面只能存简单数据类型,不能存数组、对象值,所以我重新查看了doctrine的文档,找到了继承映射的定义inheritance Maps.

因此在同样的问题上,使用embedOne给类属性嵌入不同类型的文档,可以将targetDocument定义为基础类,而所需嵌入的文档类继承自基础类,如下所示。

/*** @ODM\EmbeddedDocument* @ODM\InheritanceType("SINGLE_COLLECTION")* @ODM\DiscriminatorField("type")* @ODM\DiscriminatorMap({"type1"="type1Class"})*/class BaseClass{}/*** @ODM\EmbeddedDocument*/class type1Class {    /**    * @ODM\String    */    public $type = 'type1';}

从上面代码可以知道
1. 在定义基础类时要定义继承类型,odm 提供了两种类型,一种如上,一种是COLLECTION_PER_CLASS,两种定义的不同点是嵌入文档的存储位置,第二种是将各个文档都存在自己的集合中,并且也不用设置Discriminator定义,不用存在同一个集合内,也不需要映射查找了;
2. DiscriminatorField是定义区分不同嵌入文档的标志,由自己定义,在每个继承类中都要包含此属性
3. DiscriminatorMap定义了type到文档类的映射关系,doctrine根据此映射关系,找到要存储的文档,从而实现嵌入不同文档在同一个属性值内

1 0