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


How to use Merge on partly serialized document in 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。如何避免?是否有合并或保留的解决方法?

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

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