我有一个实体模板和另一个请求。本质上,模板表示一个html表单,一个请求将表示填充表单的值集合以及对模板ID的引用。
class Request {
/**
* @Id @Column(type="integer")
* @GeneratedValue
*/
private $id;
/**
* @ManyToOne(targetEntity="Template", cascade={"persist"})
* @JoinColumn(name="templateId", referencedColumnName="id", nullable=false)
*/
private $template;
...
我想要实现的是,当从DB加载请求时,该对象将持有相关的Template对象及其所有数据。但是,当保存请求时,也不需要保存模板...因此cascade = {“persist”}不应该存在。
1-从db加载所有模板 2-用户从下拉列表中选择模板 3- Tmeplate显示在屏幕上,用户将其填入 4-请求已保存
$request = new \entities\Request();
//template already exist in the db
$template = $this->templateRepository->fetchTemplate(1);
$request->template = $template;
...
$this->entityManager->persist($request);
$this->entityManager->flush();
现在的问题是当我使用casade persist时它会在模板表中保存另一个Template。如果我不使用cascade持续出现错误:
致命错误:未捕获的异常'Doctrine \ ORM \ ORMInvalidArgumentException',消息'通过关系找到了一个新实体'实体\ Request#template'未配置为对实体进行级联持久操作:entities \ Template @ 00000000343e07770000000073e3b0ec。要解决此问题:在此未知实体上显式调用EntityManager#persist()或在映射中配置级联持久保存此关联,例如@ManyToOne(..,cascade = {“persist”})。如果你无法找出哪个实体导致问题,请实现'entities \ Template #__ toString()'以获得线索。在第59行的C:\ Development \ wamp \ www \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ ORMInvalidArgumentException.php
实现所需行为的正确的学说关系设置是什么?