Symfony3 сохраняет встроенную форму в Doctrine2 (нарушение ограничения целостности: пустое поле)

У меня есть две сущности Game и GameSource. У игры только один GameSource.

Game.php

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
* @ORM\Table(name = "game")
* @ORM\Entity(repositoryClass = "AppBundle\Repository\GameRepository")
*/
class Game
{
    /**
     * @ORM\Column(type = "tinyint",options = {"unsigned" = true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy = "AUTO")
     */
    private $id;
    /**
     * 
     * @ORM\OneToOne(targetEntity = "GameSource",mappedBy = "game",cascade = {"persist"})
     * @Assert\Type(type = "AppBundle\Entity\GameSource")
     * @Assert\Valid()
     */
    private $gameSource;
}

GameSource.php

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

/**
 * @ORM\Table(name = "game_source")
 * 
 * @ORM\Entity(repositoryClass = "AppBundle\Repository\GameSourceRepository")
 */
class GameSource
{
    /**
     * @ORM\Column(type = "smallint",options = {"unsigned" = true})
     * @ORM\Id
     * @ORM\GeneratedValue(strategy = "AUTO")
     */
    private $id;
    /**
     * @ORM\OneToOne(targetEntity = "Game",inversedBy = "gameSource")
     * @ORM\JoinColumn(nullable=false)
     */
    private $game;
}

Форма GameType.php

<?php

namespace AppBundle\Form;

use AppBundle\Entity\Game;
use AppBundle\Form\GameSourceType;
use Symfony\Component\Form\{
    AbstractType,
    FormBuilderInterface
};
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\{
    TextType,
    CheckboxType
};

class GameType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class, [
                'label'    => 'Nazwa rozgrywki',
                'required' => true
            ])
            ->add('gameSource', GameSourceType::class)
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => Game::class,
        ));
    }
}

И GameController.php - addAction

public function addAction(Request $request)
{
    $gameEntity = new Game();

    $form = $this->createForm(GameType::class, $gameEntity);

    $form->handleRequest($request);


    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->persist($gameEntity);
        $em->flush();
    }
}

Когда я попытался сохранить запись, у меня возникла ошибка

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'game_id' cannot be null

Проблема в том, что: Entity GameSource не видит идентификатор игры, когда я пытаюсь его спасти. Кто-нибудь знает, что я делаю не так?

вы можете опубликовать свой класс GameSourceType?

Jason Roman 14.06.2018 18:47

Я пока не могу отредактировать свой вопрос. Создаю ссылку с этим классом ссылка на сайт

Kosi 14.06.2018 19:14

Покажи мне свои функции setGame () и setGameSource ()

Jason Roman 14.06.2018 19:19

SetGame и setGameSource ссылка на сайт

Kosi 14.06.2018 20:09

Смотрите мой ответ ниже.

Jason Roman 14.06.2018 20:24
Стоит ли изучать 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
5
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С вашими объектами, когда вы вызываете свою функцию setGameSource(), вы захотите связать объект Game с GameSource. Например, вместо:

public function setGameSource(?GameSource $gameSource): self
{
    $this->gameSource = $gameSource;

    return $this;
}

вместо этого вы захотите сделать это:

public function setGameSource(?GameSource $gameSource): self
{
    $this->gameSource = $gameSource;
    $this->gameSource->setGame($this);

    return $this;
}

Таким образом сущности будут правильно связаны.

Это оно !! Большое спасибо за это решение.

Kosi 14.06.2018 20:34

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