如何检查实体是否在symfony形式中被修改

时间:2015-10-26 08:44:25

标签: php symfony doctrine-orm

我需要知道在我的表单中是否修改了articulo,但是当我在pedido之前或之后找到handleRequest时,请始终保存相同的对象。 我需要检查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();
                    ...

1 个答案:

答案 0 :(得分:0)

表单有效性检查后的第二个查找实际上并不查询数据库中的旧值:实体管理器已经存储了该实体引用,因此它只返回它而不对数据库执行额外的查询(因此返回的实体)通过第二个查找与您在函数中修改的完全相同)。

例如,您可以将原始文章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();
            ...
         }
    }
}