簡體   English   中英

嵌入各種形式-教義,symfony

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM