我有一个实体Serveur
,它与Responsable
有ManyToOne关系
class Serveur implements NotifyPropertyChanged
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var \MyBundle\Entity\Responsable
*
* @ORM\ManyToOne(targetEntity="\MyBundle\Entity\Responsable", inversedBy="serveurs", cascade={"persist"})
* @ORM\JoinColumn(name="serveur_responsable", referencedColumnName="id", nullable=true)
*
*/
private $responsable;
class Responsable
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="Uid", type="string", unique=true, nullable=false)
*/
private $uid;
当您输入一个新的Responsable时,在我的updateAction(服务端)中,我会调用一个服务,该服务查看此uid是否已经有一个Responsable,否则,我将返回一个新的Responsable:
public function updateAction(Request $request, $id)
{
$entity = $em->getRepository('MyBundle:Serveur')->find($id);
if (!$entity) {
throw $this->createNotFoundException('Unable to find Serveur entity.');
}
$editForm = $this->createEditForm($entity);
$editForm->handleRequest($request);
if ($editForm->isValid()) {
$resp = $editForm['responsable']->getData();
if($resp->getUid()){
$entity_resp = $this->container->get('app.responsable')->getResp($resp->getUid());
$entity->setResponsable($entity_resp);
}
else{
$entity->setResponsable(null);
}
现在,当我编辑服务器时,如果没有负责人,而我输入了一个,则无论负责人是否存在,它都在工作。
但是,如果我编辑已经具有负责人的servur,并且要将setResponsable设置为null,则它不起作用:
执行'UPDATE负责的SET Uid =吗? id =?'带有参数[null,192]:SQLSTATE [23000]:违反完整性约束:1062键'UNIQ_52520D076BD640E6'的重复条目
它实际上是试图将负责人的uid更新为null,但这不是我想要的,我想将负责人的uid保留在数据库中,然后删除该关系。
我想念什么吗?
谢谢!
答案 0 :(得分:0)
我使用了DataTransformer:
class RespTransformer implements DataTransformerInterface{
private $om;
public function __construct(ObjectManager $om)
{
$this->om = $om;
}
public function transform($resp)
{
if(null === $resp){
return '';
}
return $resp->getUid();
}
public function reverseTransform($uid)
{
if(!$uid){
return;
}
$resp = $this->om
->getRepository('MyBundle:Responsable')
->findOneByUid($uid);
if(null === $resp){
$resp = new Responsable();
$resp->setUid($uid);
}
return $resp;
}