Php 如何检查表单symfony中是否修改了实体
我需要知道我的表单中是否修改了Php 如何检查表单symfony中是否修改了实体,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我需要知道我的表单中是否修改了articulo,但是当我在handleRequest之前或之后找到pedido时,始终保存相同的对象。 我需要检查是否修改了articulo,如何获取它 这是我的代码: $pedido = $em->getRepository('PedidosBundle:Pedido')->find($id); ... $formulario->handleRequest($request); if($formulario-
articulo
,但是当我在handleRequest
之前或之后找到pedido
时,始终保存相同的对象。
我需要检查是否修改了articulo
,如何获取它
这是我的代码:
$pedido = $em->getRepository('PedidosBundle:Pedido')->find($id);
...
$formulario->handleRequest($request);
if($formulario->isValid()){
$pedidoAuxiliar = $em->getRepository('PedidosBundle:Pedido')->find($id);//COPIA NO MODIFICADA POR EL FORMULARIO
...
foreach($pedido->getArticulos() as $articulo){//ACTUAL PEDIDO PASADO POR FORMULARIO
//$exist = false; //Para controlar si existia este articulo o si es nuevo.
foreach($pedidoAuxiliar->getArticulos() as $articuloAuxiliar){// PEDIDO SIN PASAR POR EL FORMULARIO
if($articuloAuxiliar->getId() == $articulo->getId()){//SI ESTE ARTICULO ESTABA AÑADIDO ANTES DE EDITAR EL PEDIDO
//$exist=true;
dump($articuloAuxiliar);
dump($articulo);
die();
...
表单有效性检查后的第二个find实际上并没有查询数据库中的旧值:entity manager已经存储了该实体引用,因此它将只返回该实体引用,而不执行对数据库的额外查询(因此,第二个查找返回的实体与您在函数中修改的实体完全相同) 例如,您可以将原始项目ID存储在一个临时数组中(在hanbleRequest之前),并将该数组与修改后的实体ID进行比较(在您的情况下,这是否足够,当然取决于您实际希望如何处理更改后的项目实体) 已更新 这同样适用于代码
$pedido = $em->getRepository('PedidosBundle:Pedido')->find($id);
$articleIds = array();
// get the original article ids
foreach($pedido->getArticulos() as $articulo)
{
articleIds[] = $articulo->getId();
}
...
$formulario->handleRequest($request);
if($formulario->isValid())
{
...
foreach($pedido->getArticulos() as $articulo)
{
$exist = false; // whether the article existed previosly
// check if the article exists
if(in_array($articulo->getId(), articleIds))
{
$exist=true;
//dump($articuloAuxiliar);
dump($articulo);
die();
...
}
}
}
用一个例子更新了答案如何使用一个单独的数组来检查新文章…@ejuhjav为什么使用2
foreach
?你可以直接在第一个中使用if(在数组中($articulo->getId(),articleIds)){你的代码…}
。对不起,我不明白你的意思。你的代码(和答案)只需检查表单提交前后是否存在一篇文章,即我不知道你在评论中所说的“同一实体”是什么意思?@gp\u sflover cheers-没有任何理由(除了懒惰之外,本例的主要目的是回答为什么两个发现的实体相同的问题)。更新了代码示例。@ejuhjav是的,我知道,我只是想添加一些有用的东西来改进您的响应。在任何情况下(我不记得它是否仅适用于托管实体,或者您需要手动调用$uow->computeChangeSets();
之前……我没有时间检查)如果@Ivanjavierbrancogavilan只为了避免对DB的查询而需要进行此检查,那么也可以在将实体传递给$uow
之前直接向条令询问是否有更改,如下所示:$uow=$em->getUnitOfWork();$changeSet=$uow->getEntityChangeSet($entity);