为什么 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
端的关系。我强烈建议这样做。
我有以下代码:
$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
端的关系。我强烈建议这样做。