在Persisting new Entity,Mapping table列到2个表时插入NULL。学说2

时间:2011-10-07 11:39:20

标签: php doctrine doctrine-orm

我需要将同一列映射到2个差异表(假设正常和扩展)。

 /**
 * @var ItemValue
 *
 * @OneToOne(targetEntity="ItemValue")
 * @JoinColumn(name="id_value", referencedColumnName="id_value")
 */
private $value;

 /**
 * @var ItemValueExtended
 *
 * @OneToOne(targetEntity="ItemValueExtended")
 * @JoinColumn(name="id_value", referencedColumnName="id_value")
 */
private $valueExtended;

/**
 * @var string $isExtended
 *
 * @Column(name="is_extended", type="string", nullable=false)
 */
private $isExtended = 'YES';

使用DQL基于isExtended属性加入数据没有问题:

 "SELECT id,idv FROM ItemData id 
      JOIN id.value idv WHERE  id.isExtended='NO'";

 "SELECT id,idv FROM ItemData id 
      JOIN id.valueExtended idv WHERE  id.isExtended='YES'";

但是当我想要持久保存新对象时,会在id_value列中插入NULL吗?!!

 $oValue = ItemValue();
 .
 .
 $oData = new ItemData();
 $oData->setValue($oValue);
 .
 .
 .
 $em->persist($oData);
 $em->flush();

任何想法?

2 个答案:

答案 0 :(得分:1)

来自Doctrine2文档:

  

在双向关联的情况下,您必须更新   两边的田野。

一个可能的解决方案是:

$oData = new ItemData();
$oData->setValue($oValue);
$oValue->setData($oData);

但这很乏味。 另一个更好的一个是在一对一关联的两边设置级联选项:

@OneToOne(targetEntity =“ItemValue”),cascade = {“persist”,“remove”})

这样你的代码就可以了。您可以选择适当的级联选项,查看here

答案 1 :(得分:0)

如果父实体和子实体都是新实体(两者都没有被持久化),父实体上的PrePersist生命周期事件可以提供帮助:

/**
 * ....
 *
 * @ORM\HasLifecycleCallbacks
 */
class ParentEntity {...

/**
 * @ORM\PrePersist()
 */
public function prePersist() {

    foreach($this->getChildEntities() as $childEntity) {
        $childEntity->setParent($this);
    }
}

-

class ChildEntity {
....

这将自动创建孩子 - >保存父母时的父母关系。 在许多情况下,Doctrine将能够在SQL级别完成其余的工作。