2017-01-17 7 views
2

カスタムアップデートの後、すでにデータベースから取得したエンティティの値をリフレッシュする方法があるかどうかを知りたいと思います。Doctrine 2更新後のエンティティのリフレッシュ

<?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-などの選択、何かを使用せずに「新しいテスト名」を印刷する必要がある>($の要素)を持続。 $ em-> refreshAllManagedEntities();

方法はありますか?

P.S.私はカスタムクエリを避けることはできません、これは私が何をしなければならないの半分の例です。このお問い合わせを避け、エンティティマネージャを使用する必要がありますについては

答えて

4

$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); 
を使用する必要があります
+0

私は知っていますが、このケースではクエリを避けることはできません。 –

+0

ありがとう!私はそういうふうに思っています... –

+0

私たち全員が学ぶとは言わないでください!助けて嬉しいです – goto

関連する問題