Я пытаюсь сохранить данные, которые я получил в своей сущности, с помощью ассоциации OneToMany.
С FOS REST Bundle я получаю объект в контроллере.
public function add(Campaign $campaign)
{
$em = $this->getDoctrine()->getManager();
$em->persist($campaign);
$em->flush();
Мои сущности:
class Campaign
{
/**
* @ORM\OneToMany(targetEntity = "App\Entity\CampaignDates",
* mappedBy = "campaign", cascade = {"persist"})
*/
private $dates;
public function addDate(CampaignDates $date): self
{
if (!$this->dates->contains($date)) {
$this->dates[] = $date;
$date->setCampaign($this);
}
return $this;
}
class CampaignDates
{
/**
* @ORM\ManyToOne(targetEntity = "App\Entity\Campaign",
inversedBy = "dates")
*/
private $campaign;
public function getCampaign(): ?Campaign
{
return $this->campaign;
}
public function setCampaign(?Campaign $campaign): self
{
$this->campaign = $campaign;
return $this;
}
В базе данных идентификатор в таблице campaign_dates, связанный с кампанией, пуст.
Я просто обновляюсь с помощью сеттера и получателя.
Просто чтобы исключить очевидное, действительно ли вы вызываете функцию add (где вы сохраняете campaign)? Вы также можете посмотреть трассировку отладки symfony, чтобы убедиться, что ваша база данных обновляется так, как вы ожидаете, с помощью соответствующих операторов sql.
Я использую SensioFrameworkExtraBundle для преобразования json в объект перед сохранением и сбросом. Я обнаружил, если просто построю сущности. как new Campaign () ... и затем настаивайте на том, что он работает нормально. Итак, я предполагаю, что это связано с преобразованием Param и пакетом, но когда я проверяю значение с помощью отладчика, я не вижу никакой разницы. так что интересно, если каскад сохраняется, не выполняется при сохранении и сбросе?




Попробуйте эту команду:
php bin/console doctrine:schema:validate
OR
php bin/console d:s:v
Вы пробовали: доктрина php bin / console: migrations: diff и после доктрины php bin / console: migrations: migrate. Когда вы это сделаете, он автоматически создаст addCampaign () и removeCampaign ()
Я получил setCampaign, созданный, когда я создал объект с помощью bin / console make: entity
Единственный способ, который я нашел на данный момент для решения проблемы, который я не считаю хорошим, - это снова создать связанные объекты. Мой код выглядит так
$dates = $campaign->getDates();
if ($dates) {
foreach ($dates as $date) {
$dateObj = new CampaignDates();
$dateObj->setDate($date->getDate())->setName($date->getName());
$campaign->removeDate($date);
$campaign->addDate($dateObj);
}
}
$em = $this->getDoctrine()->getManager();
$em->persist($campaign);
$em->flush();
Я не уверен, но он работает для Symfony 2.6. Измените вы setCampaign на это
public function setCampaign(?Campaign $campaign): self {
$this->campaign = $campaign;
$campaign->addDate($date);
return $this;
}
Вы можете это проверить. Symfony Doctrine One to Many не вставляет внешний ключ
Я собираюсь обновить вопрос, поскольку он не работает при использовании ParamConverter с FOS Rest Bundle и Framework Extra Bundle. Я написал это в комментарии. Просто так это сработало и для меня. даже без $ campaign-> addDate ($ date); также у вас есть ошибка, поскольку в вашей функции никогда не устанавливается $ date.
Можете ли вы показать код функции
setCampaignв вашем объектеCampaignDates?