【问题标题】:Why isn't count returning the correct number of elements in a Doctrine Collection?为什么 count 不返回 Doctrine Collection 中正确数量的元素?
【发布时间】:2017-02-05 05:08:07
【问题描述】:

我有以下代码:

 $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 对象的计数)始终返回零,即使已为给定 UrlGroup 添加了 URL。此代码用于 AJAX 调用。

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

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

【问题讨论】:

    标签: php symfony collections doctrine-orm persistence


    【解决方案1】:

    这是因为您执行$em->flush() 的事实意味着执行了数据库操作,但并不意味着您的$urlGroup 对象已刷新-php 在执行flush 之前仍然具有其状态,这意味着0 @ 987654324@.

    尝试调用:

    $em->refresh($urlGroup)
    

    就在$em->flush 之后。这将使用数据库中的信息刷新$urlGroup

    【讨论】:

      【解决方案2】:

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

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

      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 侧的关系。我强烈建议这样做。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-19
        • 1970-01-01
        • 1970-01-01
        • 2016-12-01
        • 2020-03-26
        • 1970-01-01
        相关资源
        最近更新 更多