Symfony2 / Doctrine - 使用两个实体和一个带元数据的连接/连接形式

时间:2013-09-23 21:42:10

标签: php symfony doctrine entity formbuilder

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

  

合同(身份证,姓名,服务)
  服务(id,name,recommendedPrice)
   ContractService (client_id,service_id,adjustedPrice)

我希望有一个用于创建/修改“合同”的表单,其中显示每个可能的“服务”的复选框,以及调整了该服务的价格

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

现在我拥有了我的'合同'实体,该实体与'ContractServices'有一个oneToMany关联,因为合同可以有许多ContractServices。 'ContractServices'实体与'服务'有多个ToOo关联,manyToOne在这里是否正确?

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

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

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

这是处理此问题的最佳方法吗?

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

1 个答案:

答案 0 :(得分: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();
}