0

だから私は3つのエンティティを持っています...

コントラクト(id、name、services)
サービス(id、name、recommendedPrice)
ContractService (client_id、service_id、adjustedPrice)

「契約」を作成/編集するためのフォームが必要です。このフォームには、可能な「サービス」ごとにチェックボックスが表示され、そのサービスの調整価格のテキスト フィールドが表示されます。

これらすべてを構築する最善の方法を見つけようと何日も費やしましたが、本当に苦労しています。ユーザーのアクセス許可を有効/無効にするために使用するフォームと設計が似ていると思いますが、良い例が見つかりません。

現在、Contract には多くの ContractServices を含めることができるため、 「ContractServices」に oneToMany 関連付けを持つ「 Contract 」エンティティがあります。ContractServices」エンティティには、「Services」への manyToOne 関連付けがあります。ここで manyToOne は正しいですか?

ContractServiceTypeフォームを使用してサービスを収集しようとすると、フォームをレンダリングする前に 1 つ以上のダミーの「ContractService」エンティティを「Contract」エンティティに割り当てていない限り、フォームにデータが表示されません (埋め込まれたタスク/タグと同様) Symfony サイトのフォーム チュートリアル)。

また、データが永続化されると、'ContractServiceType' フォームの複製が開始されます。1 回はダミー用、もう 1 回はその'Contract' のデータベースに永続化されたもの用です。これは私がこれまでに行った中で最も近いので、コントローラーにロジックを記述して、後で作成するダミーエンティティを決定することにしました。これは、既に'Contract'に関連付けられているものに基づいています。より良い解決策。

したがって、現在の私の解決策は、'Service'エンティティ リポジトリを使用して一意の 'Services'をすべてクエリし、それらのサービスを使用して多数のダミーの 'ContractService'エンティティを生成し、フォームの作成時に使用することです。可能な'services'ごとにチェックボックス(「有効にする」)とadjustedPriceフィールドを取得するという点で、私が探しているものが得られます。

これはこれを処理する最良の方法ですか?

もしそうなら、 ContractServiceフォームビルダーで関連する「サービス」名を参照する方法はありますか(結合されたテーブルを介して利用できるはずですか?)

4

1 に答える 1

0

ManytoManyできませんでしたか?

これは、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();
}
于 2013-09-23T21:47:53.187 に答える