2013-03-12 39 views
0

我想用下面的代碼將嵌入式文檔插入到我的文檔中。學說正在製作重複的文檔條目

// Add states, for the joining player. 
    $state = new PlayerState(); 
    $state->setReady(false); 
    $state->setPlayer($player->getId()); 
    $game->addPlayerState($state); 

    // Save element. 
    $dm->persist($game); 
    $dm->flush(); 

問題是,這產生了2個這樣的PlayerState文檔。

{ "_id" : ObjectId("513f50a58ead0ee9ac00000f"), 
    "ready" : false, 
    "player" : "513f509f8ead0e8bac00000b" }, 
{ "_id" : ObjectId("513f50af8ead0ecdac000015"), 
    "ready" :false, 
    "player" : "513f509f8ead0e8bac00000b" } 

我是不是保存在一個不正確的方式嗎?讓我知道,如果你需要更多的代碼。

+0

我是一個教條noob的一點,但如果你刪除刷新它是否工作?據我所知堅持應該保存並刷新當前工作單元的「刷新」,即插入,所以可能會刷新導致多個插入這裏 – Sammaye 2013-03-12 16:13:06

+0

如果我跳過沖洗,我似乎並沒有保存。我試圖刷新遊戲,然後設置gameState,然後再次刷新。但仍然沒有運氣。 – MartinElvar 2013-03-12 16:23:30

+0

nope flush保存你需要的東西 – Gigala 2013-04-22 11:17:16

回答

0

這似乎有伎倆。

$state = new PlayerState(); 
    $state->setReady(false); 
    $state->setPlayer($player->getId()); 
    $dm->persist($state); 
    $dm->flush(); 
    $game->addPlayerState($state); 
    // Save element. 
    $dm->flush(); 

這很難解釋,但我會試一試。 您需要先保留嵌入式文檔,否則Doctrine將首先保留文檔,僅使用設置的值製作嵌入式文檔,就像是一個簡單的數據容器。

$state->setReady(false); 
    $state->setPlayer($player->getId()); 

後,原則將再次堅持嵌入文檔,但這次看Document對象,分配的ID,默認值等

2項所致。

+0

啊,現在有道理! – Sammaye 2013-03-12 19:43:50

+0

它是因爲$ state是新的並且沒有「真正」存在,通過執行flush可以將它寫入數據庫,之後可以將它添加到$ game(因爲它存在) – Gigala 2013-04-22 11:19:06