我需要将同一列映射到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();
任何想法?
答案 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级别完成其余的工作。