我有两个具有OneToMany关系的实体
class Surgery implements SurgeryInterface
{
...
/**
* @ORM\OneToMany(targetEntity="Incompass\SurgeryBundle\Entity\Tray", mappedBy="surgery", cascade={"persist","remove"})
*/
protected $trays;
...
}
class Tray implements TrayInterface
{
...
/**
* @ORM\ManyToOne(targetEntity="Incompass\SurgeryBundle\Entity\Surgery", inversedBy="trays")
* @ORM\JoinColumn(name="surgery_id", referencedColumnName="id")
* @Assert\NotBlank()
*/
protected $surgery;
...
}
这些实体及其服务/处理程序一直运行正常。我最近在外科手术中添加了一个新的领域,这样我就可以在没有获得所有托盘记录的情况下获得手术中的托盘数量,并且在添加/删除托盘时我可以调用实体的功能
/**
* @ORM\Column(type="integer")
* @Gedmo\Versioned
*/
protected $num_trays;
...
/**
* Update num_trays
*
* @return Surgery
*/
public function updateNumTrays()
{
$trays = $this->getTrays();
$this->setNumTrays(count($trays));
return $this;
}
这可以在任何地方使用,但在RESTful POST期间。出于某种原因,当我创建一个新的手术,并添加托盘,托盘不能正常存在。实际上,我的POST分为2个请求,第一个创建手术,第二个创建托盘。
在第二个POST中我有这段代码(这简化为相关代码)
$entityManager = $this->getDoctrine()->getManager();
$surgery = $entityManager->getRepository('IncompassSurgeryBundle:Surgery')->find($id);
$trays = $request->request->get('add_trays');
$this->get('incompass_surgery.surgery.service')->addRemoveTrays($surgery, $trays);
$entityManager->flush();
$surgery->updateNumTrays();
addRemoveTrays()函数正常工作,我可以看到数据库中的新托盘。 当我第一次尝试创建托盘时,updateNumTrays()函数将num_trays设置为0,如果托盘已经存在则创建新托盘并返回新的托盘。
例如,如果我的请求将add_trays设置为2.那么我第一次发布它时会创建2个托盘,但updateNumTrays()会将num_trays设置为0.如果我再次发出请求,它会再创建2个托盘,并且updateNumTrays()将num_trays设置为4。
我在函数
的末尾添加了这个// Get updated Surgery
$surgery2 = $entityManager->getRepository('IncompassSurgeryBundle:Surgery')->find($id);
var_dump(count($surgery2->getTrays()));
$trays = $entityManager->getRepository('IncompassSurgeryBundle:Tray')->findBy(array('surgery' => $id));
var_dump(count($trays));
如果请求将add_trays设置为2,则输出为:
0
2
为什么我从存储库获得的手术无法正确获取其托盘?我特别困惑,因为托盘存储库可以找到它们。
答案 0 :(得分:0)
我刚刚想出来了。我需要从实体经理那里分离手术,然后获得它的新副本:
$entityManager->flush();
$entityManager->detach($surgery);
$surgery = $entityManager->getRepository('IncompassSurgeryBundle:Surgery')->find($id);
$surgery->updateNumTrays();