【问题标题】:Symfony2 & DoctrineMongoDB ODM: Custom Mapping TypesSymfony2 和 DoctrineMongoDB ODM:自定义映射类型
【发布时间】:2015-11-26 23:10:58
【问题描述】:

我的问题如下:我有一个存储此类对象的 mongo 数据库 { "name":"Accord Neo", "number_of_photos":"3", "id":"accord_neo", "description":"Very comfortable sofa.", "details": { "chair_is": false, "Sofa_bed": "delfin", "Structure_configuration": "corner" }, "properties":[ { "property":"2-У-1", "value":"2150 X 1550 X 880" }, { "property":"Sleeping place", "value":"2150 X 1550 X 880" } ] }​

我需要使用 Doctrine Mapping Types 在 Symfony2 中检索这些对象,问题是我不明白如何为字段“详细信息”和字段“属性”创建映射的自定义类。我试着从学说官网打个比方 http://docs.doctrine-project.org/projects/doctrine-mongodb-odm/en/latest/reference/basic-mapping.html#custom-mapping-types 但我仍然不明白它是如何工作的,以及在我的情况下应该如何实施。

【问题讨论】:

    标签: mongodb symfony doctrine-odm


    【解决方案1】:

    为“详细信息”创建一个新文档,如下所示:

    use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;
    
    /**
     * @MongoDB\EmbeddedDocument
     */
    class Details
    {
    }
    

    请注意,它是一个嵌入式文档,因此它将作为一条记录的一部分存储在 mongodb 中。对属性执行完全相同的操作

    然后在你的父对象中,嵌入一组它们并在你的构造函数中创建集合:

    /**
     * @MongoDB\EmbedOne(targetDocument="Details")
     */
    protected $details;
    
    /**
     * @MongoDB\EmbedMany(targetDocument="Properties")
     */
    protected $propertieslist;
    
    public function __construct()
    {
            $this->propertieslist = new ArrayCollection();
    }
    

    你可以使用 symfony 自带的工具生成你的 setter 和 getter。

    假设您使用 Forms 来管理它们,您需要为每个嵌入文档创建一个 FormType。

    有关详细信息,您只需将“new DetailsType”作为您的类型(而不是“text”或“choice”)。

    对于属性,您需要添加一个“集合”,然后传递一个数组,其中 'type' => new PropertiesType。动态添加和删除将需要一些 javascript。详情在这里:http://symfony.com/doc/current/cookbook/form/form_collections.html

    【讨论】:

    • 感谢@Xaraxia 的回答,只是一件小事:“详细信息”和“属性”类中应该写什么?我想我还必须为“详细信息”声明每个属性,为“属性”声明相同的属性。
    • 是的,你知道。我假设您了解基本的文档结构,因为它位于您链接的页面上。嵌入的文档是完全相同的。受保护的$chair_is;受保护的$Sofa_bed;受保护的$Structure_configuration;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 2019-01-25
    • 2011-10-15
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 2018-08-23
    相关资源
    最近更新 更多