2014-07-11 2 views
0

Я сейчас в процессе написания тестов для некоторых устаревших кодов. Одно из объектов, над которыми я работаю, содержит ArrayCollection других объектов в отношениях «один ко многим». Когда я загружаю данные в свои приборы, я вижу, что сущности с одной стороны отношения правильно содержат сущности на стороне многих сторон отношения, используя отладчик PhpStorm.Doctrine 2 - Использование PersistentCollection

По-видимому, ArrayCollection становится PersistentCollection, когда он сохраняется в базе данных.

Метод, который я сейчас тестирую, пытается перебрать этот новообразованный PersistentCollection с foreach, но, ничего, ничего не происходит. Коллекция, в соответствии с отладчиком, содержит метаданные отношений, но не возвращает значения, введенные мной в исходный код 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

is '$ child3 = new Entity3();' опечатка? – FuzzyTree

+0

Да, это так. Должно быть исправлено сейчас. –

+0

Это типично, когда ваши отношения не имеют правильно настроенного каскадного параметра. Как вы объявляете OneToMany? –

ответ

0

Выяснил это.

Пытается связать объекты, добавив Entity2 экземпляров в Entity1's ArrayCollection не работает. Ни один из экземпляров Entity2 не имел идентификатор Entity1 в качестве внешнего ключа. Делать это наоборот - вручную устанавливая Entity1 для каждого Entity2 - работал, и теперь я могу перебирать коллекцию.

Я не уверен, что это поведение - неспособность создать/обеспечить соблюдение/независимо от отношения через ArrayCollection определяется поведение или ошибка, но я полагаю, что я должен опубликовать свое решение здесь в любом случае.

1

Добавьте параметр каскада в конфигурацию OneToMany. Если вы используете аннотации:

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

Отрегулируйте параметр mappedBy в соответствии с фактической реализацией.

+0

К сожалению, это не исправило ситуацию. Первоначально мой каскад был установлен в 'all', который, как я считаю, содержит' persist', но даже после его изменения * на '' persist' проблема остается. Я вижу метаданные, но все. Я собираюсь добавить скриншот к моему оригинальному вопросу, чтобы вы и другие могли видеть, что я имею в виду –

Смежные вопросы