2014-07-11 50 views
0

我目前正在編寫一些遺留代碼的測試過程。我正在處理的其中一個實體包含ArrayCollection其他實體,它們是一對多關係。當我在我的裝置中加載數據時,我可以看到關係一側的實體使用PhpStorm的調試器正確地包含關係多方的實體。學說2 - 使用PersistentCollection

顯然,ArrayCollection在數據庫中持久化時會變成PersistentCollection

我目前正在測試的方法是試圖迭代通過這個新形成的PersistentCollectionforeach,但是,好吧,什麼都沒有發生。根據調試器,該集合包含關係元數據,但不會檢索我輸入到原始ArrayCollection中的值。

示例僞代碼(由於NDA):

class Entity1 
{ 
    private $items; 

    public function __construct() { 
     $this->items = new ArrayCollection(); 
    } 

    public function addItem(Entity2 $item) { 
     $this->items[] = $item; 
    } 

    public function getItems() { 
     return $this->items; 
    } 
} 

class Entity2 {} 

$child1 = new Entity2(); 
$child2 = new Entity2(); 
$child3 = new Entity2(); 

$ent = new Entity1(); 

$ent->addItem($child1); 
$ent->addItem($child2); 
$ent->addItem($child3); 

// persist them all with the entity manager 

// end data fixtures 

// inside a different file, in the method I'm trying to test: 

$items = $ent->getItems(); 

foreach ($items as $item) { 
    // nothing happens as $items contains metadata/relationship data, but doesn't (lazy) load 
    // the Entity2 instances 
} 

下面是一個什麼樣的在PersistentCollection實際截圖:

enter image description here

注意如何coll集合,我假設是什麼應該填充我的Entity2實例,是空的。

所以,我有點不知所措。我需要能夠訪問Entity2實例,但沒有發生。有任何想法嗎?

+0

是'$ child3 = new Entity3();'一個錯字? – FuzzyTree

+0

是的。現在應該修復。 –

+0

這是典型的當你的關係沒有正確配置的級聯參數。你如何宣佈OneToMany? –

回答

0

想通了。

嘗試通過將Entity2實例添加到Entity1ArrayCollection不起作用來嘗試關聯實體。 Entity2實例中沒有一個的Entity1作爲外鍵。以相反的方式進行 - 手動設置Entity1Entity2) - 工作,我現在可以迭代該集合。

我不確定這種行爲 - 無法通過ArrayCollection創建/執行/任何關係是定義的行爲或錯誤,但我想我應該在任何情況下發布我的解決方案。

1

爲您添加級聯參數OneToMany配置。如果使用註釋:

/** 
* @ORM\OneToMany(targetEntity="Entity2", mappedBy="entity1", cascade={"persist"}) 
*/ 

將mappedBy參數調整爲您的實際實現。

+0

不幸的是,這並沒有補救的情況。我的級聯最初設置爲'all',我認爲它包含'persist',但即使在將它改爲* persist後,問題仍然存在。我可以看到元數據,但就是這樣。我將添加一個截圖到我原來的問題,所以你和其他人可以看到我的意思 –