Php 保留新实体时插入NULL,将表列映射到2个表。原则2
我需要将同一列映射到两个差异表(比如正常和扩展) 使用DQL连接基于isExtended属性的数据没有问题:Php 保留新实体时插入NULL,将表列映射到2个表。原则2,php,doctrine,doctrine-orm,Php,Doctrine,Doctrine Orm,我需要将同一列映射到两个差异表(比如正常和扩展) 使用DQL连接基于isExtended属性的数据没有问题: "SELECT id,idv FROM ItemData id JOIN id.value idv WHERE id.isExtended='NO'"; 及 但每当我想要持久化一个新对象时,就会在id_值列中插入NULL $oValue = ItemValue(); . . $oData = new ItemData(); $oData->setVal
"SELECT id,idv FROM ItemData id
JOIN id.value idv WHERE id.isExtended='NO'";
及
但每当我想要持久化一个新对象时,就会在id_值列中插入NULL
$oValue = ItemValue();
.
.
$oData = new ItemData();
$oData->setValue($oValue);
.
.
.
$em->persist($oData);
$em->flush();
有什么想法吗?来自Doctrine2文档: 在双向关联的情况下,您必须更新 两边的田地 一个可能的解决方案是:
$oData = new ItemData();
$oData->setValue($oValue);
$oValue->setData($oData);
但这很乏味另一个更好的是在一对一关联的两侧设置级联选项:
@OneToOne(targetEntity=“ItemValue”),级联={“持久”、“删除”})
这样你的代码就可以工作了。您可以选择适当的级联选项查看。如果父实体和子实体都是新实体(都没有被持久化),则父实体上的PrePersist lifecycle事件可以帮助:
/**
* ....
*
* @ORM\HasLifecycleCallbacks
*/
class ParentEntity {...
/**
* @ORM\PrePersist()
*/
public function prePersist() {
foreach($this->getChildEntities() as $childEntity) {
$childEntity->setParent($this);
}
}
-
这将在保存父项时自动创建子项->父项关系。
在许多情况下,条令将能够在SQL级别解决其余问题
$oData = new ItemData();
$oData->setValue($oValue);
$oValue->setData($oData);
/**
* ....
*
* @ORM\HasLifecycleCallbacks
*/
class ParentEntity {...
/**
* @ORM\PrePersist()
*/
public function prePersist() {
foreach($this->getChildEntities() as $childEntity) {
$childEntity->setParent($this);
}
}
class ChildEntity {
....