#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 и, наконец, перенаправить его со ссылкой на место, куда мне нравится ходить.
Выполнено.