2011-06-13 91 views
1

我試圖在Doctrine 2中映射2個MySQL表之間的關係。我擁有的實體是'Campaign',它加入到'Channel'中。在Doctrine 2中持久化映射關係中的選定實體

保存活動記錄時,必須包含通道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 \實體\頻道@ 0000000034b3dcd500000000cc77faae:

一個新的實體通過中沒有配置級聯堅持操作的關係,結果發現。顯式持久化新實體或在關係上配置級聯持久操作。

應該如何堅持這種指定,我不希望修改或保存通道實體。我研究了關於「關聯映射」的Doctrine 2文檔,但我無法理解這是如何實現的。

謝謝。

回答

1

找到有人遇到類似問題here。問題在於Campaign XML映射到Channels表(channel_id和channel_name)中有2個引用。只有channel_id是必需的,並且必須先創建通道實體並將其分配給活動實體,然後才能保持活動實體。

奇怪的是,我不需要分開明確地堅持Channel實體。我的競選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水平,預期只有頻道ID被存儲到活動表。由於沒有規定持久性規則,所以我仍然不確定這是可能的。

2

當你堅持一個對象時,你需要確保所有關聯的對象也被持久化。在這種情況下,您正在創建一個Campaign並將其與頻道關聯。如果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>