Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在ODM中对部分序列化的文档使用合并?_Php_Mongodb_Symfony_Doctrine Orm_Doctrine Odm - Fatal编程技术网

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中,您仍然可能会无意中减少计数器