在Doctrine 2中的映射关系中保留选定的实体

时间:2011-06-13 08:38:00

标签: php mysql doctrine doctrine-orm doctrine-query

我试图在Doctrine 2中映射2个MySQL表之间的关系。我的拥有实体是'Campaign',它加入'Channel'。

保存广告系列记录时,必须包含频道ID。检索广告系列时,我想使用此ID加入频道并显示频道名称(来自频道表)。我相信这是一对一的单向关系,如果我错了,请纠正我。

table relationship

我已使用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文档,但我无法理解这是如何实现的。

谢谢。

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表中。我仍然不确定这是如何可行的,因为没有指定持久性规则。