如何在Doctrine ODM中使用部分序列化文档的Merge?

时间:2013-10-31 16:23:10

标签: php mongodb symfony doctrine-orm doctrine-odm

这是用例。文档中的某些字段是可序列化/可反序列化的,而其他字段则不可序列化(请参阅@JMS\ReadOnly)。

/**
 * @JMS\Groups({"board_list", "board_details"})
 * @JMS\Type("string")
 * @MongoDB\string
 */
protected $slug;

/**
 * @JMS\Groups({"board_list", "board_details"})
 * @JMS\ReadOnly
 * @MongoDB\Increment
 */
protected $views;

在控制器中我执行操作以更新文档:

/**
 * [PUT] /boards/{slug} "put_board"
 * @ParamConverter("board", converter="fos_rest.request_body")
 * @Rest\Put("/boards/{slug}")
 * @Rest\View(statusCode=204)
 */
public function putBoardAction($slug, Board $board)
{
    $dm = $this->get('doctrine_mongodb')->getManager();
    $board = $dm->merge($board);
    $dm->flush();
    return true;
}

如果views字段在操作之前有一些值,则在操作之后它会重置为0.如何避免它?有没有解决方法合并或坚持?

1 个答案:

答案 0 :(得分:0)

如果$views属性是只读的,而不是在反序列化时设置,则在调用操作时它将是0。合并时,ODM首先尝试通过其标识符查找Board文档。当它在数据库中找到它时,它的$views属性将是存储在数据库中的当前值。该文档现在成为merge()最终将返回的托管副本。从那里,我们继续复制传递给merge()的董事会文件中的值。在这样做时,$views设置为0,覆盖它可能存储的任何正数。当ODM转而刷新此更改时,它会计算新值和原始值之间的差异(可能是原始视图计数乘以-1)并将其用于$inc。该更新使数据库值回归零。

我的建议是发布一个单独的更新来增加$views,可能使用查询构建器。即使$views对于JMS Serializer服务不是只读的,如果将$views小于相应数据库值的Board发送到API,您仍可能无意中减少计数器。