所以最後我設法解決我的問題,以下@ 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