У меня есть следующий код:
$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 () возвращает правильный номер.
Цените это, если кто-то может помочь пролить свет на проблему.
Это потому что факт что ты делаешь $em->flush()
означает, что операция с базой данных выполнена, но это не означает, что ваша $urlGroup
объект обновлен — php еще имеет свое состояние до flush
был выполнен, то есть с 0 urls
,
Попробуй позвонить:
$em->refresh($urlGroup)
сразу после $em->flush
, Это освежит $urlGroup
с информацией из базы данных
Я думаю, что принятый ответ немного вводит в заблуждение — да, вы обновите объект его коллекцией, но, на мой взгляд, это обходной путь. Что вообще 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
сторона вашего отображения. Я настоятельно рекомендую сделать это.