所以最后我设法解决我的问题,以下@ 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
然后,我创建了一个辅助类(它被声明为一个服务)来管理任何Entity
和Document
之间的联系:
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文件中导入常用的“文档列表”显示。
这就是所有人!
我希望这可以帮助:)
怎么样一个单向的ManyToMany?文档是否关心在您的域中链接到哪些实体? –
单向是好的,但问题依然存在:即使如此,我也不得不复制表格/治疗或制作奇怪的常见表格/治疗。 – Blacksad