[英]Embed a collection of forms - doctrine, symfony
我有兩個表“ RFQ”和“ RFQitem”。 我可以制作一個表格,以其標題描述和金額創建詢價單。 我可以創建RFQitem表單,該表單可以創建RFQitem及其標題,描述和金額。
當我需要升級我的詢價單時,問題就開始了,以便我可以在其中填寫要保存在表中的詢價單,但需要將其分配給詢價單。
在symfony文檔中,有一個很好的例子 ,實際上對我有用,但這是關於任務及其標簽的例子。 因此,任務具有多個屬性(名稱,描述),但標記僅具有一個屬性。
我的帶有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建立ManyToMany關系呢?
最好的方法是使這兩個實體像您實際所做的那樣,具有您喜歡的屬性的父親和孩子集合,但不要局限於Symfony示例。 這是一個理論上的OOP,沒有定義關系,因此我將盡最大努力根據Theatre-> Works集合粘貼一個連貫的示例:
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中使用此Collection,然后創建兩個Form Types,parent和childs,類似於下面的示例。
TheatherType表單類型包括Work子項:
$buider->add('rowswork', 'collection', array(
'type' => new WorkChildType(),
'allow_add' => true,
'allow_delete' => true,
)
);
因此,一行帶有其工作子項的Work子項具有自己的WorkChildType和來自實體的屬性。 它就像一個表單,具有嵌入式項目數組,在您的情況下是“ RFQ”父表單和“ RFQitem”子表單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.