Php 实体关系学说
我有一个实体模板和另一个请求。从本质上讲,模板表示html表单,请求表示表单中填充的值的集合和对模板id的引用Php 实体关系学说,php,doctrine-orm,doctrine,Php,Doctrine Orm,Doctrine,我有一个实体模板和另一个请求。从本质上讲,模板表示html表单,请求表示表单中填充的值的集合和对模板id的引用 class Request { /** * @Id @Column(type="integer") * @GeneratedValue */ private $id; /** * @ManyToOne(targetEntity="Template", cascade={"persist"}) * @JoinColumn(name="templateId", referen
class Request {
/**
* @Id @Column(type="integer")
* @GeneratedValue
*/
private $id;
/**
* @ManyToOne(targetEntity="Template", cascade={"persist"})
* @JoinColumn(name="templateId", referencedColumnName="id", nullable=false)
*/
private $template;
...
我试图实现的是,当从DB加载请求时,对象会包含相关的模板对象及其所有数据。但是,在保存请求时,也不需要保存模板。。。因此,cascade={“persist”}不应该存在
1-从数据库加载所有模板
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时,它会在templates表中保存另一个模板。如果我不使用cascade持久化错误:
致命错误:未捕获异常“条令\ORM\ORMInvalidArgumentException”,消息“通过关系“entities\Request\template”找到了一个新实体,该关系未配置为级联实体:entities的持久化操作\Template@00000000343e07770000000073e3b0ec. 要解决此问题,请对此未知实体显式调用EntityManager#persist(),或在映射中配置cascade persist此关联,例如@manytone(..,cascade={“persist”})。如果您无法找到导致问题的实体,请在C:\Development\wamp\www\vendor\doctrine\orm\lib\doctrine\orm\orm\ORMInvalidArgumentException.php的第59行实现“entities\Template\uuuu toString()”以获取线索
实现所需行为的正确原则关系设置是什么?为什么不使用这样的setter
$request->setTemplate($template)代码>?我不熟悉条令,使用setter时有什么区别?请阅读:但是$template是私有的,我对请求实体的属性有\uuuu get,虽然这是相同的,但我看不出您使用的是\uu get(),但是现在ye也有意义,因为您声明它也是私有的。执行\doctor\Common\Util\Debug::dump($template)时,您看到了什么代码>和\Doctrine\Common\Util\Debug::dump($request)代码>?