Php 保留新实体时插入NULL,将表列映射到2个表。原则2

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

我需要将同一列映射到两个差异表(比如正常和扩展)

使用DQL连接基于isExtended属性的数据没有问题:

 "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 {
....