这是用例。文档上的某些字段是可序列化/可反序列化的,而其他字段则不是(请参阅@JMSReadOnly
)。
/**
* @JMSGroups({"board_list", "board_details"})
* @JMSType("string")
* @MongoDBstring
*/
protected $slug;
/**
* @JMSGroups({"board_list", "board_details"})
* @JMSReadOnly
* @MongoDBIncrement
*/
protected $views;
在控制器中时,我执行操作以更新文档:
/**
* [PUT] /boards/{slug} "put_board"
* @ParamConverter("board", converter="fos_rest.request_body")
* @RestPut("/boards/{slug}")
* @RestView(statusCode=204)
*/
public function putBoardAction($slug, Board $board)
{
$dm = $this->get('doctrine_mongodb')->getManager();
$board = $dm->merge($board);
$dm->flush();
return true;
}
如果views
字段在操作之前具有某个值,则在操作之后,该字段将重置为 0。如何避免?是否有合并或保留的解决方法?
如果 $views
属性是只读的,并且在反序列化时未设置,则在调用操作时将0
该属性。合并时,ODM 首先将尝试按其标识符查找董事会文档。当它在数据库中找到它时,其 $views
属性将是存储在数据库中的当前值。该文档现在将成为merge()
最终将返回的托管副本。从那里,我们继续复制传递给merge()
的董事会文件中的值。这样做,$views
被设置为0
,覆盖它可能存储的任何正数。当ODM刷新此更改时,它会计算新值和原始值之间的差异(可能是原始视图计数乘以-1
),并将其用于$inc
。该更新使数据库值恢复为零。
我的建议是发布一个单独的更新来增加$views
,也许使用查询构建器。即使 JMS 序列化程序服务的$views
不是只读的,如果将$views
小于相应数据库值的板发送到 API,您仍然可能无意中减少计数器。