为什么 count 没有返回 Doctrine Collection 中正确数量的元素?

Why isn't count returning the correct number of elements in a Doctrine Collection?

我有以下代码:

 $em = $this->getDoctrine()->getManager();
            if($groupType == 'existing'){
                $urlGroup = $em->getRepository('UrlBuilderBundle:UrlGroup')->find($groupId);
            }elseif($groupType == 'new'){
                $urlGroup   = new UrlGroup();
                $groupName  = $submittedData['groupName'];
                $urlGroup->setName($groupName);
                $em->persist($urlGroup);
            }

            $url = new Url();
            $url->setName($name);
            $url->setAuthorUser($authorUser);
            $url->setUrl($generatedUrl);
            $url->setUrlGroup($urlGroup);

            $em->persist($url);
            $em->flush();

            $urlGroupName = $urlGroup->getName();
            $urlCount = count($urlGroup->getUrls());

创建新的 UrlGroup 时,最后一行(子 URL 对象的计数)始终 returns 零,即使已添加 URL给定的 UrlGroup。此代码用于 AJAX 调用。

页面刷新后 count() returns 正确的数字。

如果有人能帮助阐明这个问题,我们将不胜感激。

这是因为您执行 $em->flush() 意味着执行了数据库操作,但这并不意味着您的 $urlGroup 对象已刷新 - php 仍然具有其在 flush 已经执行,意思是 0 urls.

尝试调用:

$em->refresh($urlGroup)

$em->flush 之后。这将使用来自数据库

的信息刷新$urlGroup

我认为接受的答案有点误导 - 是的,您将使用它的集合刷新对象,但我认为这是一种解决方法。通常 flush 给出的是模型的标识符 (id)。

您正在 owning 端调用 $url->setUrlGroup($urlGroup);,但未更新 inverse 端。 setUrlGroup 方法中需要做什么 Url class:

public function setUrlGroup($group)
{
    $this->urlGroup = $group;
    $group->addUrl($this);
}

并恭敬地在UrlGroup class:

public function addUrl($url)
{
    if (!$this->$urls->contains($url) {
        $this->$urls->add($url);
    }
}

上面的$urls应该是ArrayCollection的实例。

这修复了映射 inverse 端的关系。我强烈建议这样做。