0

所以我有三个实体......

Contract(id、name、services)
Service(id、name、recommendedPrice)
ContractService(client_id、service_id、adjustedPrice)

我想要一个用于创建/编辑“合同”的表单,该表单为每个可能的“服务”显示一个复选框,并为该服务的调整价格显示一个文本字段。

我花了几天的时间试图找出构建所有这些的最佳方法,但我真的很难过。我会假设它在设计上类似于您用于启用/禁用用户权限的表单,但我找不到任何好的示例。

现在我有我的 ' Contract ' 实体,它与它的 'ContractServices'有一个 oneToMany 关联,因为一个 Contract 可以有许多 ContractServices。'ContractServices'实体与 'Services' 有一个 manyToOne 关联,这里manyToOne 是否正确?

当我尝试使用ContractServiceType表单收集服务时,除非我在呈现表单之前将一个或多个虚拟“ContractService”实体分配给“Contract”实体(类似于嵌入的任务/标签),否则我不会在表单上获得任何数据Symfony 网站上的表单教程)。

此外,一旦数据被持久化, 'ContractServiceType' 表单开始复制,一次用于虚拟对象,再次用于已为该'Contract'持久化到数据库的任何表单。这是迄今为止我最接近的一次,所以我决定我可以在控制器中编写逻辑来决定稍后创建哪些虚拟实体,基于这些虚拟实体已经与'Contract'相关联,尽管看起来应该有一个更好的解决方案。

所以我现在的解决方案是使用'Service'实体 repo,查询所有唯一的 'Services',然后使用这些服务生成一些虚拟的 'ContractService'实体,以便在构建表单时使用。它产生了我正在寻找的东西,因为我得到了每个可能的“服务”的复选框(“启用”)和调整价格字段。

这是处理这个问题的最好方法吗?

如果是这样,有没有办法在ContractService表单构建器中引用关联的“服务”名称(应该通过连接表获得?) ?

4

1 回答 1

0

你不能做一个多对多吗?

这就是 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 回答