2014-03-04 62 views
0

假设我有一个公司,我管理Employees, Cars, Contracts, Buildings, Sites, Products,等。你可以猜到,这些是非常独立的事情,所以没有继承是可能的。链接1实体与许多其他类实体

对于每一个元素(即实体)的,我希望能够将一个或几个Document S(点击一个按钮,窗体打开,选择一个/多个Document或上传一个新的)。

Document链接到一种实体不是问题,我的问题是有很多种实体。我应该如何管理?我有2个想法有自己的问题...:

  1. 创建文档和员工,另一个文件和汽车之间的一个多对多的关系,等等。
    • 问题:我要重复控制器添加文档的代码,复制表单等。
  2. 创建包含文档ID,相关实体的ID和相关实体的类名的单个连接表。
    • 问题:它看起来不太干净,我没有真正挖掘这种方式,但我觉得我会遇到很多“实体映射”问题。

有什么建议吗?


[编辑]

其实我要做的Event也是相同的:我需要一些Events链接到一些Employees和/或一些Cars等在我真正的情况下,我有超过10个实体链接到Event和/或Document,这意味着如果我使用解决方案1,则复制更多20倍的代码!

+0

怎么样一个单向的ManyToMany?文档是否关心在您的域中链接到哪些实体? –

+0

单向是好的,但问题依然存在:即使如此,我也不得不复制表格/治疗或制作奇怪的常见表格/治疗。 – Blacksad

回答

0

所以最后我设法解决我的问题,以下@ Rpg600想法有关映射超。

这可能不是最好的和最干净的解决方案,我并不是很自豪,但它的确做到了,而且比我的第一个想法还要好。

我创建了一个BaseEntity这是我的一个映射超类(Employee,Car等实体必须扩展这个类):因为它是不可能有一个超多到多关系

/** 
* BaseEntity 
* @ORM\MappedSuperclass 
*/ 
class BaseEntity { 

    /** 
    * @ORM\OneToOne(targetEntity="MyProject\MediaBundle\Entity\Folder") 
    */ 
    private $folder; 


    /** 
    * Set folder 
    * @param \Webobs\MediaBundle\Entity\Folder $folder 
    * @return BaseEntity 
    */ 
    public function setFolder(\Webobs\MediaBundle\Entity\Folder $folder = null){ 
     $this->folder = $folder;   
     return $this; 
    } 

    /** 
    * Get folder 
    * @return \Webobs\MediaBundle\Entity\Folder 
    */ 
    public function getFolder(){ 
     return $this->folder; 
    }   
} 

,我用一个Folder其中将包含一个或几个Document。这是解决方案中不好的部分;在folder表基本上只包含一个字段,它是id ...

class Folder 
{ 
    private $id; 

    /** 
    * Note : Proprietary side 
    * @ORM\ManyToMany(targetEntity="MyProject\MediaBundle\Entity\Document", inversedBy="folders", cascade={"persist"}) 
    * @ORM\JoinTable(name="document_in_folder") 
    */ 
    private $documents; 
    // setters and getters 

然后,我创建了一个辅助类(它被声明为一个服务)来管理任何EntityDocument之间的联系:

class DocumentHelper extends Controller 
{ 
    protected $container; 

    /** ************************************************************************ 
    * Constructor 
    * @param type $container 
    **************************************************************************/ 
    public function __construct($container = null) 
    { 
     $this->container = $container; 
    } 


    /** ************************************************************************ 
    * Attach Document(s) to an $entity according to the information given in the 
    * form. 
    * @param Entity $entity 
    * @param string $redirectRouteName Name of the route for the redirection after successfull atachment 
    * @param string $redirectParameters Parameters for the redirect route 
    * @return Response 
    **************************************************************************/ 
    public function attachToEntity($entity, $redirectRouteName, $redirectParameters) 
    { 
     $folder = $entity->getFolder(); 
     if($folder == NULL){ 
      $folder = new Folder(); 
      $entity->setFolder($folder); 
     } 

     $form = $this->createForm(new FolderType(), $folder); 

     // ------------- Request Management ------------------------------------ 
     $request = $this->get('request'); 
     if ($request->getMethod() == 'POST') { 
      $form->bind($request); // Link Request and Form 

      if ($form->isValid()) { 
      $em = $this->getDoctrine()->getManager(); 
      $em->persist($folder); 
      $em->persist($entity); 
      $em->flush(); 

      return $this->redirect($this->generateUrl($redirectRouteName, $redirectParameters)); 
      } 
     } 


     return $this->render('MyProjectMediaBundle:Folder:addDocument.html.twig', array(
      'form'  => $form->createView(), 
      'entity' => $entity, 
     )); 
    } 

做这样一来,我只需要在每个相关的控制器添加一个小的动作,让我们说EmployeeController.php

public function addDocumentAction(Employee $employee) 
    {   
     $redirectRouteName = 'MyProjectCore_Employee_see'; 
     $redirectParameters = array('employee_id' => $employee->getId()); 
     return $this->get('myprojectmedia.documenthelper')->attachToEntity($employee,$redirectRouteName,$redirectParameters); 
    } 

相同的显示原理,在助手中我具有通用功能,我在我已有的seeAction()中调用并在TWIG文件中导入常用的“文档列表”显示。

这就是所有人!

我希望这可以帮助:)

1

假设你使用Doctrine ORM,我想你正在寻找Mapped Superclasses的继承。

的文档是胜于言:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#mapped-superclasses

+0

这是interresting谢谢,我不知道那些Mapped超级类。但是,似乎在Mappedsuper类中不可能有多对多(或甚至是一对多)关系。我将继续对这些贴图超类进行调查,以了解我是否可以找到解决方法;如果您有任何建议,请不要犹豫。无论如何,这对我的项目的其他部分会很有用:) – Blacksad

相关问题