2014-10-21 52 views
0

我有兩個表「RFQ」和「RFQitem」。我可以製作一份表格,用它們的標題描述和數量創建詢價。我可以創建RFQitem表單,它可以創建RFQitem的標題,描述和金額。嵌入窗體集合 - 教條,symfony

當我需要升級我的RFQ表格時,問題就開始了,因此我可以在其中填寫RFQitems,它將保存在表格中,但需要將其分配給RFQ。

在symfony文檔中很棒example這實際上適用於我,但是這是一個例子,帶有任務和它們的標籤。所以任務有多個屬性(名稱,描述),但標籤只有一個名稱。

我與RFQItems RFQ實體看起來是這樣的:

/** 
* @ORM\ManyToMany(targetEntity="RFQItem", cascade={"persist"}) 
* @ORM\JoinTable(name="rfq_item_title", 
*  joinColumns={@ORM\JoinColumn(name="rfq_item_title", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="id", referencedColumnName="id")} 
*) 
*/ 
protected $rfq_item_title; 

/** 
* @ORM\ManyToMany(targetEntity="RFQItem", cascade={"persist"}) 
* @ORM\JoinTable(name="rfq_item_description", 
*  joinColumns={@ORM\JoinColumn(name="rfq_item_description", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="id", referencedColumnName="id")} 
*) 
*/ 
protected $rfq_item_description; 

/** 
* @ORM\ManyToMany(targetEntity="RFQItem", cascade={"persist"}) 
* @ORM\JoinTable(name="rfq_item_amount", 
*  joinColumns={@ORM\JoinColumn(name="rfq_item_description", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="id", referencedColumnName="id")} 
*) 
*/ 
protected $rfq_item_amount; 

但我知道,這是不對的,但我怎麼能有RFQitem其中有不止一個屬性多對多的關係?

回答

1

最好的辦法是讓這兩個實體像你實際做的一樣,父親和你喜歡的屬性集合的孩子,但不要被固定到Symfony的例子。這是一個理論上的OOP,沒有定義的關係,所以我打算讓粘貼根據Theater->一個連貫的例子我最好的嘗試作品徵集:

class Theater 
{ 
private $name; 
private $id; 

/** 
* Set name 
* @param string $name 
* @return Theater 
*/ 
public function setName($name) 
{ 
    $this->name = $name; 
    return $this; 
} 

/** 
* Get name 
* @return string 
*/ 
public function getName() 
{ 
    return $this->name; 
} 

/** 
* Get id 
* @return integer 
*/ 
public function getId() 
{ 
    return $this->id; 
} 
/** 
* @var \Doctrine\Common\Collections\Collection 
*/ 
private $work; 

/** 
* Constructor 
*/ 
public function __construct() 
{ 
    $this->work = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

/** 
* Add work 
* 
* @param \Acme\RelationBundle\Entity\Work $work 
* @return Theater 
*/ 
public function addWork(\Acme\RelationBundle\Entity\Work $work) 
{ 
    $this->work[] = $work; 
    return $this; 
} 

/** 
* Remove work 
* @param \Acme\RelationBundle\Entity\Work $work 
*/ 
public function removeWork(\Acme\RelationBundle\Entity\Work $work) 
{ 
    $this->work->removeElement($work); 
} 

/** 
* Get work 
* @return \Doctrine\Common\Collections\Collection 
*/ 
public function getWork() 
{ 
    return $this->work; 
} 
} 

然後子實體工作:

class Work 
{ 
// took out some comments to make it shorter 
private $name; 
private $description; 
private $id; 


/** 
* Set name 
* @param string $name 
* @return Work 
*/ 
public function setName($name) 
{ 
    $this->name = $name; 
    return $this; 
} 

/** 
* Set description : And any others setters/getters with the attributes you want 
* @param string $description 
* @return Work 
*/ 
public function setDescription($description) 
{ 
    $this->description = $description; 

    return $this; 
} 

/** 
* Get name 
* @return string 
*/ 
public function getName() 
{ 
    return $this->name; 
} 

/** 
* Get description 
* @return string 
*/ 
public function getDescription() 
{ 
    return $this->description; 
} 

/** 
* Get id 
* @return integer 
*/ 
public function getId() 
{ 
    return $this->id; 
} 


public function __toString() 
{ 
    return (string) $this->getName(); 
} 
} 

訣竅是在Doctrine中使用這個集合,然後創建一個兩個Form類型,父類和子類,如下面的這個例子。

TheatherType Formtype包括孩子的工作:

  $buider->add('rowswork', 'collection', array(
       'type' => new WorkChildType(), 
       'allow_add' => true, 
       'allow_delete' => true, 
      ) 
     ); 

因此,有一排與具有自己的WorkChildType從實體的屬性他們工作的孩子的。它就像一個表單,嵌入數組項目,在你的情況下是一個「RFQ」父表單和「RFQitem」子表單。