我试图在Doctrine 2中映射2个MySQL表之间的关系。我的拥有实体是'Campaign',它加入'Channel'。
保存广告系列记录时,必须包含频道ID。检索广告系列时,我想使用此ID加入频道并显示频道名称(来自频道表)。我相信这是一对一的单向关系,如果我错了,请纠正我。
我已使用Doctrine 2 XML指定了映射,如下所示:
<one-to-one field="channelId" target-entity="Channel" fetch="EAGER">
<join-column name="channel_id" referenced-column-name="id" />
</one-to-one>
填充广告系列实体并尝试保留它时,我收到以下错误。
通过未配置为级联持久操作的关系找到新实体:Mvc \ Entity \ Channel @ 0000000034b3dcd500000000cc77faae。明确保留新实体或在关系上配置级联持久操作。
如何指定此持久性,我不想修改或保存通道实体。我已经研究了关于“关联映射”的Doctrine 2文档,但我无法理解这是如何实现的。
谢谢。
答案 0 :(得分:2)
当您持久保存对象时,您需要确保所有关联的对象也是持久的。在这种情况下,您将创建一个Campaign并将其与Channel关联。如果Channel对象尚未持久化,则需要在调用flush之前执行此操作,或者在关系上添加持久级联。以下是您的两个选择:
1)在您的代码中,当您持续使用Campaign时,也会明确地保留频道。
$em->perist($campaign);
$em->persist($campaign->getChannel());
2)在Campaign :: channel上放置一个持久级联。当Channel对象与Campaign关联时,它将自动保留Channel对象。我不知道XML中的确切语法,但请尝试
<one-to-one field="channelId" target-entity="Channel" fetch="EAGER">
<join-column name="channel_id" referenced-column-name="id" />
<cascade><cascade-persist /></cascade>
</one-to-one>
答案 1 :(得分:1)
找到有类似问题的人here。问题是Campaign XML映射中有2个引用到Channels表(channel_id和channel_name)。只有channel_id是必需的,并且必须先创建渠道实体并将其分配给广告系列实体,然后才能保留广告系列实体。
奇怪的是,我不需要单独明确地保留Channel实体。我的Campaign XML映射如下所示:
<one-to-one field="channelId" target-entity="ToastChannels" fetch="EAGER">
<join-column name="channel_id" referenced-column-name="id" />
</one-to-one>
作业如下:
$channelEntity = $this->_channelsDao->disableCache()->findObject($channelId]);
$campaignEntity->setChannel($channelEntity);
return $this->_campaignDao->save($campaignEntity);
在数据库级别,只有通道ID按预期存储到Campaign表中。我仍然不确定这是如何可行的,因为没有指定持久性规则。