0

这是用例。文档中的某些字段是可序列化/可反序列化的,而另一些则不是(参见 参考资料@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。如何避免它?是否有解决方法 Merge 或 Persist?

4

1 回答 1

0

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

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

于 2014-01-03T21:58:17.030 回答