1

我正在尝试在 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 文档,但我无法理解这是怎么可能的。

谢谢你。

4

2 回答 2

2

当你持久化一个对象时,你需要确保所有关联的对象也被持久化。在这种情况下,您正在创建一个营销活动并将其与一个渠道相关联。如果 Channel 对象尚未持久化,则需要在调用 flush 或在关系上放置持久级联之前这样做。这是您的两个选择:

1)在您的代码中,当您持久化 Campaign 时,还要显式持久化 Channel。

$em->perist($campaign);
$em->persist($campaign->getChannel());

2) 在 Campaign::channel 上放置一个持久级联。当 Channel 对象与 Campaign 关联时,这将自动持久化它。我不知道 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>
于 2011-06-13T18:34:47.080 回答
1

在这里找到有类似问题的人。问题是 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);

在 DB 级别,只有 Channel ID 按预期存储到 Campaign 表中。我仍然不确定这是怎么可能的,因为没有指定持久性规则。

于 2011-06-14T08:10:18.660 回答