这是用例。文档中的某些字段是可序列化/可反序列化的,而其他字段则不可序列化(请参阅@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.如何避免它?有没有解决方法合并或坚持?
答案 0 :(得分:0)
如果$views
属性是只读的,而不是在反序列化时设置,则在调用操作时它将是0
。合并时,ODM首先尝试通过其标识符查找Board文档。当它在数据库中找到它时,它的$views
属性将是存储在数据库中的当前值。该文档现在成为merge()
最终将返回的托管副本。从那里,我们继续复制传递给merge()
的董事会文件中的值。在这样做时,$views
设置为0
,覆盖它可能存储的任何正数。当ODM转而刷新此更改时,它会计算新值和原始值之间的差异(可能是原始视图计数乘以-1
)并将其用于$inc
。该更新使数据库值回归零。
我的建议是发布一个单独的更新来增加$views
,可能使用查询构建器。即使$views
对于JMS Serializer服务不是只读的,如果将$views
小于相应数据库值的Board发送到API,您仍可能无意中减少计数器。