更新后的Doctrine 2刷新实体

时间:2017-01-17 08:36:56

标签: php doctrine-orm symfony

我想知道在自定义更新后是否有办法刷新已从数据库检索的实体的值。

一个例子

<?php

/**
 * Element
 *
 * @ORM\Table(name="table_element")
 */
class Element{

    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
      private $id

    /**
     *
     * @var string
     *
     * @ORM\Column(name="element_name", type="string", length=255)
     */
      private $name

      public function setName($name){
             $this->name = $name;
      }

      public function getName(){
             return $this->name;
      }

      public function getId(){
             return $this->id;
      }
}

// Inside Controller

   $em = $this->getDoctrine()->getManager();

   $element = $em->getRepository('Element')->find(1);

   // This prints "Test 1"
   echo $element->getName();

   $qb = $em->createQueryBuilder();

   $qb->update('Element', 'E')
      ->set('E.name', 'New Test Name')
      ->where('E.id = :id')
      ->setParameter('id', $element->getId()) ;

   $qb->getQuery()->execute();

   // This still prints "Test 1", i need to print "New Test Name" without using again a select
   // Something like $em->refreshManagedEntities();
   echo $element->getName();

我需要打印“新测试名称”而不再使用选择,例如$ em-&gt; persist($ element); $ EM-&GT; refreshAllManagedEntities();

有办法吗?

P.S。我无法避免自定义查询,thiis是我必须做的简化示例。

1 个答案:

答案 0 :(得分:5)

为此,您应该避免查询并使用实体管理器:

$qb = $em->createQueryBuilder();

$element = $em->getRepository('Element')->find(1);

// Prints "Test 1"
echo $element->getName();

$element->setName('New Test Name');
$em->persist($element);
$em->flush();

// Prints "New Test Name"
echo $element->getName(); 

如果您必须使用查询运行,或者在脚本之外完成实体更改,则应使用refresh

   $em->refresh($entity);