【问题标题】:How can I add to a collection of a new obect?如何添加到新对象的集合中?
【发布时间】:2014-07-07 12:18:09
【问题描述】:

我通过 Typo3 Flow 中的集合获得了一个与另一个对象具有多对多关系的对象。创建该对象的新实例(已成功添加到存储库)后,我可以简单地添加到此集合中。

abc模型的代码sn-p:

/**
* @var \Doctrine\Common\Collections\Collection<[..]\Domain\Model\Xyz>
* @ORM\ManyToMany(targetEntity="[..]\Domain\Model\Xyz")
*/
protected $xyzs;

[...]

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

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

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

问题是在我将它添加到存储库之前,我无法将它添加到这个集合中。 (我猜这是因为不存在的外键)。

abc 控制器的代码 sn-p(不起作用!):

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

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

    [...]
}

在 addAction() 完全完成之前,abc 控制器中不存在 xyz 集合。但是如何在 addAction() 完成之前添加到这个集合中呢?

【问题讨论】:

    标签: symfony orm doctrine-orm extbase typo3-flow


    【解决方案1】:

    它可能会返回无对象错误,因为集合是对象数组。

    public function addXYZ([..]\Domain\Model\Xyz $xyz) {
            $this->xyzs[] = $xyz;
    }
    

    【讨论】:

    • true 但 $collection->contains($someobject) 无论是否包含对象,都应始终返回 true 或 false。问题是在您将对象保存到存储库之前,该集合不存在。正如我所说,addXYZ() 函数在对象位于存储库中之后可以正常工作...
    【解决方案2】:

    最终的解决方案需要做一些工作: 我通过重定向到 PROTECTED 来获取 $newABC、$someXYZ 和一些参考资料!在同一个控制器中运行。 (如果没有保护,你可以用 url 调用它)

    在那里,持久性管理器已经持久化了 $newABC。因此,我可以轻松地添加 $someXYZ 并最终将其重定向到我喜欢去的地方。

    完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      • 2014-12-09
      • 1970-01-01
      • 2016-02-23
      相关资源
      最近更新 更多