2017-08-07 58 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

相關問題