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);