2017-08-07 57 views
2

我被要求收回一个人在几个月前离开公司的代码。 他developped一个应用程序,允许一些人要求改变防火墙规则 当土特产品问一个变化,您可以选择/填充: 防火墙的域名(对应于防火墙接口) 端口 源地址 目的地址 服务类型(TCP/UDP/ICMP)Symfony唯一违规.....键xxxxx已存在

有2个表中的数据库:

Rule           FW 
----------         --------- 
ID           ID 
Fw_Id          Name 
idrule          Description 
Port           ---------- 
Source Address 
Destination Adress 
Service Type 
---------- 

这里只有1防火墙/规则和1条规则/防火墙

当我尝试保存表单时,我的问题出现了,原则试图保存所有的防火墙信息,不仅仅是id,并且告诉我们存在唯一的密钥违规。 我搜查,但无法弄清楚什么是错

规则实体:

<?php 

namespace FWBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 

/** 
* Rule 
* 
* @ORM\Table(name="rule", uniqueConstraints={@ORM\UniqueConstraint(name="unique_fw_id", columns={"fw_id", "idrule"})}) 
* @ORM\Entity(repositoryClass="FwBundle\Repository\ruleRepository") 
* @UniqueEntity(fields={"fw","idrule"}, message="Rule already exists") 
*/ 

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

    /** 
    * @ORM\OneToOne(targetEntity="FwBundle\Entity\fw") 
    * @ORM\JoinColumn(name="fw_id",referencedColumnName="id") 
    * @Assert\Valid() 
    */ 
    private $fw; 

    /** 
    * @var int 
    * 
    * @ORM\Column(name="idrule", type="integer") 
    */ 
    private $idrule; 

的FW实体:

<?php 

namespace FWBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 


/** 
* fw 
* 
* @ORM\Table(name="fw") 
* @ORM\Entity(repositoryClass="FWBundle\Repository\FwRepository") 
* @UniqueEntity(fields="name", message="Firewall already exists.") 
*/ 
class Fw 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

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

的RuleController:

public function AddAction($id,Request $request) 
{ 
    $namespace = 'FwBundle'; 
    $em = thiss->getDoctrine()->getManager(); 
    $repositoryRule = $em->getRepository($namespace.':Rule'); 
    $repositoryFw = $em->getRepository($namespace.':Fw'); 

    $rule = new rule(); 

    $form = $this->createForm(RuleType::class, $rule,array('fw'=>$id)); 
    $form->handleRequest($request); 
     if ($form->isSubmitted() && $form->isValid()) { 
      $rule = $form->getData(); 
      $em->persist($rule); 
      $em->flush(); 
     } 
} 
+0

你能与你的规则表单类编辑您的帖子? –

+0

你也可以添加你的RuleType表单吗? –

回答

0

Rule只能被链接到一个Firewall和一个Firewall可以链接到一个Rule。你试图做的是将多个Rule连接到一个Firewall

你或许应该考虑改变像OneToOne关系ManyToOne该防火墙可以有许多规则和错误应该消失(你当然有之前更新数据库架构)

如果您确信OneToOne是如果防火墙已经拥有一个,则不需要在表单中创建新规则。

你的代码应该是与此类似:

public function AddAction($id,Request $request) 
{ 
    $namespace = 'FwBundle'; 
    $em = thiss->getDoctrine()->getManager(); 
    $repositoryRule = $em->getRepository($namespace.':Rule'); 
    $repositoryFw = $em->getRepository($namespace.':Fw'); 

    $rule = new rule(); // remove this line and change it with the two lines below 
    $fw = $repositoryFw->find($id); // assuming that id is the id of firewall 
    $rule = $fw->getRule() ? : new Rule(); // if Firewall has a rule entity then take it otherwise create a new one. 

    $form = $this->createForm(RuleType::class, $rule,array('fw'=>$id)); 
    $form->handleRequest($request); 
     if ($form->isSubmitted() && $form->isValid()) { 
      $rule = $form->getData(); 
      $em->persist($rule); 
      $em->flush(); 
     } 
} 
+0

感谢您的帮助,我尝试了您的建议,但得到的错误告诉我表单应该使用Rule的实体,但使用Doctrine Collection。 – ricardo

+0

所以你把onetoone改成manytoone? – zizoujab

+0

是的,在查看问题后,我有一个持久性问题,我的表单中的某些元素没有持久化 – ricardo

相关问题