我有一个实体模板和另一个请求。本质上,一个模板代表一个 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;
...
我想要实现的是,当从数据库加载 Request 时,该对象将包含相关的 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 时,它会在模板表中保存另一个模板。如果我不使用级联持续存在错误:
致命错误:未捕获的异常 'Doctrine\ORM\ORMInvalidArgumentException' 带有消息'通过关系 'entities\Request#template' 找到了一个新实体,该关系未配置为对实体进行级联持久操作:entities\Template@00000000343e07770000000073e3b0ec。要解决此问题:在此未知实体上显式调用 EntityManager#persist() 或配置级联在映射中保持此关联,例如 @ManyToOne(..,cascade={"persist"})。如果您无法找出导致问题的实体,请执行“entities\Template#__toString()”以获取线索。在 C:\Development\wamp\www\vendor\doctrine\orm\lib\Doctrine\ORM\ORMInvalidArgumentException.php 第 59 行
实现所需行为的正确教义关系设置是什么?