在原则2中以映射关系持久存在选定的实体

问题描述

| 我正在尝试在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文档,但是我不知道这是怎么可能的。 谢谢。     

解决方法

        持久化对象时,需要确保所有关联的对象也都持久化。在这种情况下,您将创建一个Campaign,并将其与Channel关联。如果尚未持久保存Channel对象,则需要在调用flush或对关系进行持久级联之前执行此操作。这是您的两个选择: 1)在代码中,当您保留Campaign时,还应显式保留Channel。
$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>
    ,        在这里找到了类似问题的人。问题在于,Campaign XML映射中有两个对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表中。由于尚未指定持久性规则,因此我仍然不确定如何实现。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...