Doctrine ODM如何无需映射所有字段保存JSON对象?
关于ODM中保存无映射JSON对象的两种实现方案
没问题,这两种需求都能轻松实现,我给你拆解下具体怎么做:
一、无需映射到任何类,直接保存JSON对象
大部分ODM(比如Doctrine MongoDB ODM)都支持直接操作底层的MongoDB集合,跳过实体类映射这一步。你可以直接获取集合实例,然后调用插入方法存入原始JSON/数组数据。
举个例子(以Doctrine MongoDB ODM为例):
// 获取文档管理器 $dm = $this->get('doctrine_mongodb')->getManager(); // 获取目标集合(比如叫"countries") $collection = $dm->getDocumentCollection('App\Document\Country')->getMongoCollection(); // 直接插入你的JSON数组 $countries = [{"id":28,"Title":"Sweden"},{"id":56,"Title":"USA"},{"id":89,"Title":"England"}]; $collection->insertMany($countries); // 或者单条插入 $collection->insertOne(["id":100,"Title":"Japan"]);
这种方式完全不需要定义任何实体类,直接和MongoDB原生交互,适合快速存储结构不固定的JSON数据。
二、映射到仅含$object属性的通用类
如果你还是想通过ODM的实体类机制来管理,但又不想为每种JSON结构单独定义类,可以创建一个通用的“容器”类,用一个属性来存储整个JSON对象。
比如定义这样一个通用实体类:
<?php namespace App\Document; use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB; /** * @MongoDB\Document(collection="generic_data") */ class GenericData { /** * @MongoDB\Id */ private $id; /** * @MongoDB\Field(type="raw") * 用raw类型可以直接存储任意JSON结构的数组/对象 */ private $object; // Getter和Setter方法 public function getId() { return $this->id; } public function getObject() { return $this->object; } public function setObject($object) { $this->object = $object; } }
然后保存的时候,只需要把你的JSON数组/对象赋值给$object属性即可:
$dm = $this->get('doctrine_mongodb')->getManager(); // 单条数据 $genericData = new GenericData(); $genericData->setObject(["id":28,"Title":"Sweden"]); $dm->persist($genericData); // 多条数据 $countries = [{"id":56,"Title":"USA"},{"id":89,"Title":"England"}]; foreach ($countries as $country) { $item = new GenericData(); $item->setObject($country); $dm->persist($item); } $dm->flush();
这种方式既保留了ODM的生命周期管理、查询等特性,又能灵活存储任意结构的JSON数据,完美匹配你说的“映射到仅包含一个对象属性的类”的需求。
你之前已经实现的无映射字段的数组保存,本质上和第一种直接操作集合的思路一致,要是想更规范地通过ODM实体来管理,第二种通用类方案会更合适。
内容的提问来源于stack exchange,提问作者Mave
相关产品推荐
相关产品推荐

