【问题标题】:Doctrine MongoDB ODM do not change state of referenced objectDoctrine MongoDB ODM 不会改变引用对象的状态
【发布时间】:2013-07-31 22:36:54
【问题描述】:

我将 Symfony2 与 DoctrineMongoDB Bundle 一起使用。我创建了一个以 JSON 格式(对象)接收信息的服务。

我发送的对象有一个属性,用于引用数据库中不同集合中的另一个对象。

更改参考作品。但是,如果我发送另一个字段,例如 ObjectB 的“标题” - 它会将标题设置为数据库中的新值。我怎样才能防止这种情况发生?

我只想设置新的引用,而不是对该对象进行任何操作。

这是一些代码(缩短)

class Fun{    
   /**
     * @MongoDB\Id(strategy="auto")
     */
    private $id;

   /** @MongoDB\EmbedMany(targetDocument="JokeEmbedded", strategy="set")
    */
   private $jokes = array();

}


class JokeEmbedded
{
    /**
     * @MongoDB\ReferenceOne(targetDocument="JokePattern", cascade={"persist"})
     */
    private $ref;

    /**
     * @MongoDB\String
     */
    private $title;
}

class JokePattern
{
    /**
     * @MongoDB\Id(strategy="AUTO")
     */
    private $id;

    /**
     * @MongoDB\String
     */
    private $title;
}

我现在将以下 JSON 发送到服务:(JSON 代表 ObjetClass Fun)

[{"id":"1","jokes":[{"ref":{"id":"222", "title":"new title"}]]

我现在的问题是,我如何忽略我要设置的引用的新给定“标题”? 我想将数据库中的新引用设置为 ID 222。仅此而已。

任何帮助都会很棒! 谢谢!

编辑:

这是处理 JSON 输入的代码

$request = $this->getRequest();
//Get JSON-Data
$data = $request->getContent();
$funs = $this->get('serializer')->deserialize(
    $data,
    'ArrayCollection<Acme\FunBundle\Document\Fun>',
    'json'
);

//create documentmanager
$dm = $this->get('doctrine_mongodb')->getManager();

foreach ($funs as $obj) {
        //save to db
        $dm->persist($obj);
    }
$dm->flush();

【问题讨论】:

  • 您能否分享获取 JSON 有效负载、修改模型并执行 flush() 的实际代码? JSON 与文档结构不直接匹配,因此我们仍然看不到您的托管文档是如何被修改的。
  • 我更新了我的帖子
  • 在您的示例中,您似乎没有设置参考。我不确定您使用的是 Symfony 组件还是 Johannes') 库,但反序列化正在为每个类构建一个新对象。 ODM JokePattern 由级联持久化,而 JokeEmbedded 仅在存储在 Fun 文档中时包含引用。如果你有一个 setter 方法,JokeEmbedded 上的 $title 属性也可能会被设置,但我不知道。我建议查看序列化程序文档以排除字段。
  • 您好,是的,新引用不是由代码设置的。它在 JSON 中,应该在内部进行管理。这确实有效,但现在你的标题也发生了变化。所以没有办法用教义来管理这个吗?我正在使用 jms 序列化程序,知道该怎么做吗?我需要一种方法来区分序列化和反序列化设置 - 但我在 de docs 中找不到类似的东西。 :( 谢谢 :)
  • 我将尝试使用@Accessor/@HandlerCallback 并通过模型中的代码对其进行管理。或者直接在 Setter-Method 中。我会尽快发布我的状态:) 到目前为止谢谢

标签: mongodb symfony reference doctrine odm


【解决方案1】:

我使用反序列化上下文和 JMS SerializerBundle 中的列表注释来管理它。

你好 :)

【讨论】:

    猜你喜欢
    • 2017-08-14
    • 2015-04-10
    • 1970-01-01
    • 2011-09-03
    • 2012-12-20
    • 2017-08-13
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    相关资源
    最近更新 更多