为什么不计算在Doctrine Collection中返回正确数量的元素?

时间:2016-09-27 14:05:15

标签: php symfony collections doctrine-orm persistence

我有以下代码:

 $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后,即使已为给定的UrlGroup添加了网址,最后一行(子网址对象的数量)也始终返回零。此代码用于AJAX调用。

页面刷新count()返回正确的数字。

如果有人能帮助解决这个问题,那就表示赞赏。

2 个答案:

答案 0 :(得分:1)

这是因为你执行$em->flush()这意味着执行了数据库操作,但这并不意味着你的$urlGroup对象被刷新 - php在flush之前仍然处于状态执行,意思是0 urls

尝试致电:

$em->refresh($urlGroup)

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

中的信息刷新$urlGroup

答案 1 :(得分:0)

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

您在$url->setUrlGroup($urlGroup);方面呼叫owning,但未更新inverse方。需要在setUrlGroup类中的Url方法中执行哪些操作:

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

尊敬地UrlGroup班:

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

据说上面$urlsArrayCollection的实例。

这可以修复映射的inverse侧的关系。我强烈建议这样做。