Почему count не возвращает правильное количество элементов в 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) всегда возвращает ноль, даже если URL был добавлен для данной UrlGroup. Этот код используется в вызове AJAX.

После обновления страницы count () возвращает правильный номер.

Цените это, если кто-то может помочь пролить свет на проблему.

0

Решение

Это потому что факт что ты делаешь $em->flush() означает, что операция с базой данных выполнена, но это не означает, что ваша $urlGroup объект обновлен — php еще имеет свое состояние до flush был выполнен, то есть с 0 urls,

Попробуй позвонить:

$em->refresh($urlGroup)

сразу после $em->flush, Это освежит $urlGroup с информацией из базы данных

1

Другие решения

Я думаю, что принятый ответ немного вводит в заблуждение — да, вы обновите объект его коллекцией, но, на мой взгляд, это обходной путь. Что вообще flush дает идентификаторы (идентификаторы) вашей модели.

Ты звонишь $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);
}
}

предположительно $urls выше пример ArrayCollection,

Это фиксирует отношение на inverse сторона вашего отображения. Я настоятельно рекомендую сделать это.

0

По вопросам рекламы [email protected]