这是编辑前的文件。
{
"EstadoPedido" : 10,
"IdPedido" : 3113,
"Meta" : {
"DataAlt" : "2018-05-25 15:33:21",
"DataCri" : "2018-05-25 15:28:51",
"IdUserAlt" : "83",
"IdUserCri" : 83,
"UserAlt" : "AAA",
"UserCri" : "AAA",
"sDataAlt" : ISODate("2018-05-25T15:33:21.000Z"),
"sDataCri" : ISODate("2018-05-25T15:28:51.000Z")
},
}
编辑后,“EstadoPedido”字段应为20或30:
{
"EstadoPedido" : 30,
"IdPedido" : 3113,
"Meta" : {
"DataAlt" : "2018-05-25 15:33:21",
"DataCri" : "2018-05-25 15:28:51",
"IdUserAlt" : "83",
"IdUserCri" : 83,
"UserAlt" : "AAA",
"UserCri" : "AAA",
"sDataAlt" : ISODate("2018-05-25T15:33:21.000Z"),
"sDataCri" : ISODate("2018-05-25T15:28:51.000Z")
},
}
EDIT //
这就是我调用函数并传递参数的方法:
$onapp->put('/pedido/setAnulado/:idPedido', function($idpedido){
$P = new Pedido();
$R = $P->setAnulado($idpedido);
$M_Ped = new \Oncargo\MongoApi\Pedido();
$ret = $M_Ped->setEstado($idpedido, 30);
echo json_encode($R);
});
$ P = new Pedido()是使用Propel框架将对象保存到SQL Server的类。
$ M_Ped = new \ Oncargo \ MongoApi \ Pedido()是要保存的Mongo Class对象。
并且$ M_Ped-> setEstado转到此处:
public function setEstado($idPedido, $estado) {
$this->IdPedido = $idPedido;
$this->Estado = $estado;
$r = $this->_mudaEstado($idPedido, $estado);
return $r;
}
然后返回更新,完整功能是:
private function _mudaEstado($idPedido, $estadoPedido) {
$userNome = $this->userData['Nome'];
$c = $this->db->selectCollection('pedidos');
if (date('I')) { $_dst = 3600; } else { $_dst = 0; }
$DataAlt = date('Y-m-d H:i:s');
$sDataAlt = new \MongoDate(strtotime($DataAlt) + $_dst);
$criteria = array('IdPedido' => $idPedido);
$update = array(
'$set' => array(
'EstadoPedido' => $estadoPedido,
'Meta.IdUserAlt' => $this->userData['IdUser'],
'Meta.UserAlt' => $userNome,
'Meta.DataAlt' => $DataAlt,
'Meta.sDataAlt' => $sDataAlt
)
);
$r = $c->update($criteria, $update);
return $r;
}
编辑2 //
我还为两个场景做了一个print_r($ update),20个(工作正常)和30个(不工作),数据相同:
工作位的输出:
Array
(
[$set] => Array
(
[EstadoPedido] => 20
[Meta.IdUserAlt] => 83
[Meta.UserAlt] => AAA
[Meta.DataAlt] => 2018-05-28 14:26:07
[Meta.sDataAlt] => MongoDate Object
(
[sec] => 1527517567
[usec] => 0
)
)
)
这是非工作更新变量的输出:
Array
(
[$set] => Array
(
[EstadoPedido] => 30
[Meta.IdUserAlt] => 83
[Meta.UserAlt] => AAA
[Meta.DataAlt] => 2018-05-28 14:28:21
[Meta.sDataAlt] => MongoDate Object
(
[sec] => 1527517701
[usec] => 0
)
)
)
正如您所看到的,两个查询都是相同的,一个是有效的,另一个不是。
答案 0 :(得分:0)
它已经解决了!这是一个新手错误!一切都很好,更新查询是100%正确!我唯一缺少的是将$ idPedido强制转换为Integer,因为参数是作为String传递的。现在它正在按预期工作。
private function _mudaEstado($idPedido, $estadoPedido) {
$userNome = $this->userData['Nome'];
$c = $this->db->selectCollection('pedidos');
if (date('I')) { $_dst = 3600; } else { $_dst = 0; }
$DataAlt = date('Y-m-d H:i:s');
$sDataAlt = new \MongoDate(strtotime($DataAlt) + $_dst);
$criteria = array('IdPedido' => (int)$idPedido); // Was missing the cast to int
$update = array(
'$set' => array(
'EstadoPedido' => $estadoPedido,
'Meta.IdUserAlt' => $this->userData['IdUser'],
'Meta.UserAlt' => $userNome,
'Meta.DataAlt' => $DataAlt,
'Meta.sDataAlt' => $sDataAlt
)
);
$r = $c->update($criteria, $update);
return $r;
}
感谢大家的宝贵帮助!希望这实际上可以帮助别人。