У меня есть две сущности 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 не видит идентификатор игры, когда я пытаюсь его спасти. Кто-нибудь знает, что я делаю не так?
Я пока не могу отредактировать свой вопрос. Создаю ссылку с этим классом ссылка на сайт
Покажи мне свои функции setGame () и setGameSource ()
SetGame и setGameSource ссылка на сайт
Смотрите мой ответ ниже.




С вашими объектами, когда вы вызываете свою функцию 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;
}
Таким образом сущности будут правильно связаны.
Это оно !! Большое спасибо за это решение.
вы можете опубликовать свой класс GameSourceType?