簡體   English   中英

Symfony2 / Doctrine-使用兩個實體以及帶有元數據的可聯合/聯合的表單

[英]Symfony2/Doctrine - form using two entities and a jointable/joinentity with metadata

所以我有三個實體...

合同 (編號,名稱,服務)
服務 (編號,名稱,推薦價格)
ContractService (client_id,service_id,adjustedPrice)

我想要一個用於創建/編輯“ 合同 ”的表格,該表格顯示每個可能的“ 服務 ”的復選框,以及一個文本框,用於說明該服務的調整后價格

我花了幾天的時間試圖找出構造所有這些內容的最佳方法,但現在真的很難。 我認為它在設計上類似於您用來為用戶啟用/禁用權限的表單,但是我找不到任何好的示例。

現在,我有了我的“ 合同 ”實體,該實體與其“合同服務”具有一個“一對多”關聯,因為一個合同可以包含許多“合同服務”。 'ContractServices'實體具有與'Services'的manyToOne關聯,在這里manyToOne正確嗎?

當我嘗試使用ContractServiceType表單收集服務時,除非在呈現表單之前已將一個或多個虛擬“ ContractService”實體分配給“ Contract”實體,否則我在表單上沒有任何數據(類似於嵌入的任務/標簽) Symfony網站上的表單教程)。

同樣,一旦數據被持久保存,“ ContractServiceType”表單就會開始復制,一次是針對虛擬對象,另一次是針對已針對“ Contract”持久化到數據庫的任何對象。 這是我到目前為止最接近的,所以我決定可以在控制器中編寫邏輯,以決定以后要創建哪些虛擬實體,基於哪些實體已經與“合同”相關聯,盡管似乎應該更好的解決方案。

因此,我現在的解決方案是使用“服務”實體存儲庫,查詢所有唯一的“服務” ,然后使用這些服務生成一些虛擬“ ContractService”實體,以便在構建表單時使用。 它產生了我要查找的內容,因為我為每個可能的“服務”都有一個復選框(“啟用”)和AdjustedPrice字段。

這是處理此問題的最佳方法嗎?

如果是這樣,是否有一種方法可以在ContractService表單構建器中引用關聯的“服務”名稱(應該通過聯接表使用?)?

你不能做很多很多嗎?

這就是ZfcRbac在ZF2 / Doctrine2中的操作方式

RbacRole實體

/**
 * @var \Doctrine\Common\Collections\Collection
 *
 * @ORM\ManyToMany(targetEntity="Admin\Entity\RbacPermission", inversedBy="role")
 * @ORM\JoinTable(name="rbac_role_permission",
 *   joinColumns={
 *     @ORM\JoinColumn(name="role_id", referencedColumnName="role_id")
 *   },
 *   inverseJoinColumns={
 *     @ORM\JoinColumn(name="perm_id", referencedColumnName="perm_id")
 *   }
 * )
 */
 protected $perm;
 /**
 * Constructor
 */
public function __construct()
{
    $this->perm = new \Doctrine\Common\Collections\ArrayCollection();
}

RbacPermission實體

/**
 * @var \Doctrine\Common\Collections\Collection
 *
 * @ORM\ManyToMany(targetEntity="Admin\Entity\RbacRole", mappedBy="perm")
 */
protected $role;
/**
 * Constructor
 */
public function __construct()
{
    $this->role = new \Doctrine\Common\Collections\ArrayCollection();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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