Как я могу добавить в коллекцию новый объект?

#symfony #orm #doctrine-orm #extbase #typo3-flow

#symfony #orm #doctrine-orm #extbase #typo3-flow

Вопрос:

у меня есть объект с отношением ManyToMany к другому объекту через коллекцию в потоке Typo3. После создания нового экземпляра этого объекта (который успешно добавлен в репозиторий) Я могу просто добавить в эту коллекцию.

Фрагмент кода модели abc:

 /**
* @var DoctrineCommonCollectionsCollection<[..]DomainModelXyz>
* @ORMManyToMany(targetEntity="[..]DomainModelXyz")
*/
protected $xyzs;

[...]

public function getXYZs() {
    return $this->xyzs;
}

public function addXYZ([..]DomainModelXyz $xyz) {
    if(!$this->xyzs->contains($xyz))
        $this->xyzs->add($xyz);
}

public function removeXYZ([..]DomainModelXyz $xyz) {
    if($this->xyzs->contains($xyz))
        $this->xyzs->removeElement($xyz);
}
  

Проблема в том, что я не могу добавить в эту коллекцию до того, как добавлю ее в репозиторий. (Я думаю, это происходит из-за несуществующих внешних ключей).

Фрагмент кода контроллера abc (не работает!):

 public function addAction([...]$newABC)
{
    [...]

    $this->abcRepository->add($newABC);
    //the line below returns "can't use contains() / add() on a non-object"
    $newABC->addXYZ($someXYZ);

    [...]
}
  

Коллекция xyz не существует в контроллере abc до тех пор, пока addAction() не будет полностью завершена. Но как я могу добавить в эту коллекцию до завершения addAction()?

Ответ №1:

Вероятно, это возвращает ошибку no object, поскольку коллекции представляют собой массивы объектов.

 public function addXYZ([..]DomainModelXyz $xyz) {
        $this->xyzs[] = $xyz;
}
  

Комментарии:

1. верно, но $collection->contains($someobject) всегда должен возвращать true или false, независимо от того, содержит он объект или нет. Проблема в том, что коллекция не существует, пока вы не сохраните объект в репозитории. Как я уже сказал, функция addXYZ() работает корректно после того, как объект находится в репозитории …

Ответ №2:

Над окончательным решением нужно немного поработать: я беру $ newABC, $ someXYZ и некоторые справочные материалы через перенаправление на ЗАЩИЩЕННЫЙ! функция в том же контроллере. (если он не защищен, вы могли бы вызвать его с помощью URL)

Там менеджер сохранения уже сохранил $newABC. Таким образом, я легко могу добавить $ someXYZ и, наконец, перенаправить его со ссылкой на место, куда мне нравится ходить.

Выполнено.