Сохранение OneToMany, связанного в Symfony 4.1 с Doctrine

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

Можете ли вы показать код функции setCampaign в вашем объекте CampaignDates?

ehymel 07.09.2018 22:40

Я просто обновляюсь с помощью сеттера и получателя.

Sela Yair 08.09.2018 00:00

Просто чтобы исключить очевидное, действительно ли вы вызываете функцию add (где вы сохраняете campaign)? Вы также можете посмотреть трассировку отладки symfony, чтобы убедиться, что ваша база данных обновляется так, как вы ожидаете, с помощью соответствующих операторов sql.

ehymel 08.09.2018 00:19

Я использую SensioFrameworkExtraBundle для преобразования json в объект перед сохранением и сбросом. Я обнаружил, если просто построю сущности. как new Campaign () ... и затем настаивайте на том, что он работает нормально. Итак, я предполагаю, что это связано с преобразованием Param и пакетом, но когда я проверяю значение с помощью отладчика, я не вижу никакой разницы. так что интересно, если каскад сохраняется, не выполняется при сохранении и сбросе?

Sela Yair 10.09.2018 11:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
4
316
4

Ответы 4

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

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

Sela Yair 08.09.2018 00:01

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

    $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.

Sela Yair 11.09.2018 15:46

Другие вопросы по теме