2017-02-09 64 views
0

我有一個簡單的問題後,查詢生成器的更新追加到已加載的實體,似乎他們是「desynchronize」。通過QueryBuilder更新後已經水化的實體同步

下面的代碼顯示probleme

/** @var EntityManager $em */ 
$repository = new PersonneRepository(); 
/** @var Personne $persone */ 
$persone = $repository->find('42'); 

echo 'SEXE : ' . $persone->getSexe() . "\n"; 

$invertedSexe = $persone->getSexe() == 'F' ? 'M' : 'F'; 
echo 'New Sexe : '.$invertedSexe."\n"; 
$q = $em->createQueryBuilder(); 
$q->update($repository->getClassName(), 'p') 
->set('p.sexe', ":sexe") 
->where('p.id = :id') 
->setParameters(array(
    'sexe' => $invertedSexe, 
    'id' => $persone->getId() 
)); 
$q->getQuery()->execute(); 
echo 'SEXE : ' . $persone->getSexe() . "\n"; 
$persone = $repository->find('42'); 
echo 'SEXE : ' . $persone->getSexe() . "\n"; 

輸出:

SEXE : M 
New Sexe : F 
SEXE : M 
SEXE : M 

回答

1

因爲你,而只是更新您的數據庫沒有更新$ persone對象。

因此,無論你去

  1. ORM的方式,這意味着你$persone->setSexe(),然後進行沖洗

這可能看起來像如:

/** @var EntityManager $em */ 
$repository = new PersonneRepository(); 
/** @var Personne $persone */ 
$persone = $repository->find('42'); 

echo 'SEXE : ' . $persone->getSexe() . "\n"; 

$invertedSexe = $persone->getSexe() == 'F' ? 'M' : 'F'; 
echo 'New Sexe : '.$invertedSexe."\n"; 

$persone->setSexe($invertedSexe); 
$em->persist($persone); 
$em->flush(); 

echo 'SEXE : ' . $persone->getSexe() . "\n"; 
$persone = $repository->find('42'); 
echo 'SEXE : ' . $persone->getSexe() . "\n"; 
  • DBAL的方式,這意味着你先更新你的數據庫,然後再刷新你的$人(find它仍然讓你的對象不是更新的數據庫實體)或者手動設置你的$ persone-> sexe。
  • 在方案2中提到的刷新在你的代碼中完成的:

    $em->refresh($persone); // instead of your last $respository->find('42'); 
    
    相關問題