Persist OneToMany ассоциируется в Symfony 4.1 с Doctrine - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь сохранить данные, полученные в организации с ассоциацией 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, который связан с кампанией, пуст.

Ответы [ 4 ]

0 голосов
/ 11 сентября 2018

Я не уверен, но это работает для Symfony 2.6. Измените установленную кампанию на

public function setCampaign(?Campaign $campaign): self {
    $this->campaign = $campaign;
    $campaign->addDate($date);
    return $this;
}

Вы можете проверить это. Учение Symfony One to Many не вставляет внешний ключ

0 голосов
/ 07 сентября 2018

Пробовали ли вы: php bin / console доктрина: миграции: diff и после php bin / console доктрина: миграции: миграция. Когда вы делаете это, он автоматически создает addCampaign () и removeCampaign ()

0 голосов
/ 11 сентября 2018

Единственный способ, который я нашел в данный момент для решения проблемы, который я не считаю хорошим, - это снова создать связанные сущности. Мой код выглядит так

    $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();
0 голосов
/ 07 сентября 2018

Попробуйте эту команду:

php bin/console doctrine:schema:validate

OR

php bin/console d:s:v
...