Php 如何在ODM中对部分序列化的文档使用合并?
下面是用例。文档上的某些字段可序列化/反序列化,而其他字段则不可序列化(请参见Php 如何在ODM中对部分序列化的文档使用合并?,php,mongodb,symfony,doctrine-orm,doctrine-odm,Php,Mongodb,Symfony,Doctrine Orm,Doctrine Odm,下面是用例。文档上的某些字段可序列化/反序列化,而其他字段则不可序列化(请参见@JMS\ReadOnly) /** *@JMS\Groups({“board\u list”,“board\u details”}) *@JMS\Type(“字符串”) *@MongoDB\string */ 受保护的$slug; /** *@JMS\Groups({“board\u list”,“board\u details”}) *@JMS\ReadOnly *@MongoDB\Increment */ 受保护
@JMS\ReadOnly
)
/**
*@JMS\Groups({“board\u list”,“board\u details”})
*@JMS\Type(“字符串”)
*@MongoDB\string
*/
受保护的$slug;
/**
*@JMS\Groups({“board\u list”,“board\u details”})
*@JMS\ReadOnly
*@MongoDB\Increment
*/
受保护的浏览量;
在控制器中,我执行更新文档的操作:
/**
*[PUT]/boards/{slug}“PUT_board”
*@ParamConverter(“board”,converter=“fos\u rest.request\u body”)
*@Rest\Put(“/boards/{slug}”)
*@Rest\View(状态代码=204)
*/
公共功能板行动($slug,Board$Board)
{
$dm=$this->get('doctrine\u mongodb')->getManager();
$board=$dm->merge($board);
$dm->flush();
返回true;
}
如果
视图
字段在操作之前有一些值,则在操作之后会重置为0。如何避免呢?是否有解决合并或持久化问题的方法?如果$views
属性为只读,并且在反序列化时未设置,则在调用操作时它将为0
。合并时,ODM将首先尝试通过其标识符查找Board文档。当它在数据库中找到它时,它的$views
属性将是存储在数据库中的当前值。该文档现在成为merge()
最终将返回的托管副本。从那里,我们继续从传递到merge()
的Board文档中复制值。在执行此操作时,$views
被设置为0
,覆盖它可能存储的任何正数。当ODM刷新此更改时,它计算新值和原始值之间的差异(可能是原始视图计数乘以-1
)并将其用于$inc
。该更新将数据库值恢复为零
我的建议是对increment$views
发布一个单独的更新,可能使用查询生成器。即使JMS序列化程序服务的$views
不是只读的,如果将$views
小于相应数据库值的板发送到API中,您仍然可能会无意中减少计数器