Napotałem na problem z zapisaniem entity Doctrine2 w relacji OneToOne.
Opis problemu:
Posiadam dwie encje: UserEntity (użytkownik) oraz UserDataEntity (dane o użytkowniku). Każdy UserEntity może posiadać UserDataEntity (ale nie jest to wymagane gdy nie podano danych), ale każdy UserDataEntity musi mieć UserEntity, którego dotyczy.
Kiedy próbuję zapisać UserEntity, otrzymuję komunikat z PostgreSQL:
> SQLSTATE[23502]: Not null violation: 7 BŁĄD: pusta wartość w kolumnie "id" narusza ograniczenie wymaganej wartości
Poniżej moje encje:
<?php /** * A user. * * @ORM\Entity * @ORM\Table(name="users") */ class UserEntity extends AbstractEntity { /** * @ORM\Id * @ORM\Column(type="integer"); * @ORM\GeneratedValue(strategy="AUTO") */ protected $id; /** * @ORM\Column(type="string") */ protected $name; /** * @ORM\OneToOne(targetEntity="ModuleAdmin\Entity\TradesmanDataEntity", inversedBy="parent", cascade={"persist"}) * @ORM\JoinColumn(name="id", referencedColumnName="data_id") */ protected $data; public function setData(UserDataEntity $data) { $this->data = $data; } }
I dane użytkownika:
<?php /** * A user's data. * * @ORM\Entity * @ORM\Table(name="users_data") */ class UserDataEntity extends AbstractEntity { /** * @ORM\Id * @ORM\OneToOne(targetEntity="ModuleAdmin\Entity\TradesmanEntity", mappedBy="parent", cascade={"persist"}) * @ORM\JoinColumn(name="data_id", referencedColumnName="id") */ protected $parent; /** * @ORM\Column(type="string") */ protected $email; /** * @ORM\Column(type="string") */ protected $phone; /** * Provides creation for new empty entity. * */ public function __construct(TradesmanEntity $parent) { $this->parent = $parent; } }
Moja schema wygląda tak:
CREATE TABLE users ( id serial NOT NULL, name character varying(255) NOT NULL, CONSTRAINT users_pkey PRIMARY KEY (id ) ); CREATE TABLE users_data ( data_id integer NOT NULL, email character varying(255) NOT NULL, phone character varying NOT NULL, CONSTRAINT users_data_pkey PRIMARY KEY (data_id ), CONSTRAINT users_data_data_id_fkey FOREIGN KEY (data_id) REFERENCES users (id) MATCH SIMPLE ON UPDATE RESTRICT ON DELETE CASCADE );
Chciałbym zachować integralność bazy danych i ogarnienia na poziomie bazy danych, nie ORM'a.